Wie kann ich C ++ - Code in eine unabhängige Windows-Programmdatei kompilieren?

1319
aswine

Ich habe ein C ++ - Programm, das ich unter Mac OS 10.11 mit g ++ kompilieren und ausführen kann. Ich konnte es auch mit Visual Studio unter Windows 10 kompilieren und ausführen. Als ich jedoch versuchte, die EXE-Datei auf einem Windows 10-Computer auszuführen, auf dem Visual Studio nicht installiert war, beklagte Windows, dass mehrere DLL-Dateien nicht vorhanden waren.

Ich möchte dieses Programm auf Windows-Computern ausführen können, ohne dass irgendetwas installiert werden muss. Das Programm ist sehr einfach, besteht aus einer .cpp-Datei und lebt nur in einem Nur-Text-Terminal. Sie müssen lediglich nach Eingaben fragen, Text anzeigen und in eine Datei schreiben. Ich verwende diese Bibliotheken:

#include <stdlib.h> #include <stdio.h> #include <cstdlib> #include <iostream> #include <fstream> #include <string> 

Ich habe MinGW sowohl in Cygwin als auch unter OS X ausprobiert. Beide geben Fehler an ‘stoi’ was not declared in this scope. Ich habe diesen Patch erfolglos ausprobiert: https://stackoverflow.com/questions/16132176/problems-with-stdstoi-not-working-on-mingw-gcc-4-7-2 Ich weiß nicht, ob MinGW meinen Fehler machen würde. exe unabhängig von anderen Dateien.

Wie kann ich mein Programm unter Windows selbstständig ausführen lassen, so dass der Benutzer keine DLL-Dateien oder andere Software installieren muss?

-1
Was Sie möchten, erfordert die Verwendung eines Compilers, der dies zulässt, oder die DLL-Dateien mit der EXE-Datei versehen. "so dass es keine .dll dateien oder andere software benötigt?" buchstäblich nicht möglich. Ramhound vor 8 Jahren 0
Ich verstehe nicht, wie es "buchstäblich nicht möglich" sein könnte. Es gibt viele Windows-Programme (insbesondere MS-DOS-Programme), bei denen der Benutzer außer Windows selbst nichts installieren muss. Vielleicht haben Sie gedacht, ich hätte gesagt, dass ich will, dass es keine andere Software benötigt. Ich habe eine Bearbeitung vorgenommen, um explizit zu sein, dass der Benutzer keine Software installieren muss. Natürlich ist Windows mit seinen Standard-DLL-Dateien dabei. aswine vor 8 Jahren 0
Sie müssen wahrscheinlich sicherstellen, dass die Visual C ++ Redistributables auf dem anderen Computer installiert sind (kann von MS-Site heruntergeladen werden). Ich gehe davon aus, dass es sich um MSVCR100.dll oder ähnliches beschwert. Tom Carpenter vor 8 Jahren 0
In dieser [StackOverflow-Frage] (http://stackoverflow.com/questions/3162325/after-building-exe-using-vs-2010-c-missing-msvcp100-dll) erfahren Sie, wie Sie die Laufzeitbibliothek statisch verknüpfen, damit Sie sie nicht ablegen Die weitervertreibbare Datei muss nicht installiert sein. Tom Carpenter vor 8 Jahren 1
Wenn Sie zur Kompilierzeit eine Bibliothek verknüpfen, was Sie getan haben, ist diese Bibliothek auf dem System erforderlich, auf dem die ausführbare Datei ausgeführt wird. MS-DOS-Programme sind keine Windows-Programme. Wenn für Ihr Programm keine zusätzlichen Bibliotheken erforderlich waren, hätte das, was Sie beschrieben haben, funktioniert, da dies erforderlich war, bedeutet dies, dass Sie mit den Bibliotheken verbunden sind und daher benötigt werden. Ramhound vor 8 Jahren 0
Anscheinend ist es nicht unmöglich, weil andere Leute davon sprechen, es getan zu haben. http://stackoverflow.com/questions/16167305/why-does-my-application-erquire-visual-c-redistributable-package Ich muss sie nur statisch verknüpfen, anstatt sie dynamisch zu verknüpfen. Eine Downvote-Erklärung wäre übrigens nett. aswine vor 8 Jahren 0
Sie geben an, dass "Windows beschwert hat, dass mehrere DLL-Dateien nicht vorhanden waren." Es wäre hilfreich für uns, die gesamte Liste der fehlenden DLLs zu haben. BillP3rd vor 8 Jahren 0
Es wurde aus der Begründung herausgegeben, dass dies zu nahe an einer Programmierfrage liegt, die SO für meinen persönlichen Geschmack gehört. Ich weiß nicht, warum ich meine Gründe teile, ich weiß, dass Sie damit nicht einverstanden sein werden, und wird wahrscheinlich eine Art Argument vorbringen, wie ich mich irre. Ramhound vor 8 Jahren 0
@aswine - Klarstellung. Was ich gesagt habe, war nicht möglich, eine Bibliothek dynamisch zu verknüpfen und dann die erforderliche Software nicht zu installieren. Selbst wenn Sie die erforderlichen Bibliotheken statisch verknüpfen, müssen Sie sie immer noch bereitstellen. Dies bedeutet im Wesentlichen, dass Ihre Software diese Bibliotheken auf dem System installieren muss, wodurch sich das Installationsprogramm vergrößert. Ich habe nur angegeben, was Sie wollten, "also keine DLL-Dateien oder andere Software?", War aus diesem Grund nicht möglich. Ramhound vor 8 Jahren 0

1 Antwort auf die Frage

0
Tom Carpenter

Wenn Sie etwas mit dem Microsoft Visual C ++ - Compiler kompilieren, wird der Compiler so kompiliert, dass er dynamisch mit der MS VC ++ - Runtime-DLL verknüpft ist (ich denke, entsprechend der Version von VS, die Sie verwenden, z. B. verwendet VS2010 die 2010-Laufzeit). Vermutlich bedeutet dies, dass sie in der Lage sind, die DLLs zu aktualisieren, ohne dass Sie Ihre Anwendung neu kompilieren müssen.

Dies bedeutet, dass Sie die Laufzeitbibliothek auf jedem Computer installieren müssen, auf dem Ihre Anwendung verwendet wird. Diese werden als Teil der auf der MS-Website verfügbaren Visual C ++ Redistributable-Installationsprogramme verteilt. Tatsächlich werden auf vielen Computern bereits die erforderlichen DLLs installiert, da viele Programme die Redistributable als Teil ihres Installationsvorgangs installieren. Dies ist jedoch keine Garantie dafür, dass dies der Fall sein würde (um ehrlich zu sein, überrascht es mich, dass sie nicht automatisch über Windows Update installiert werden).

Es ist eine Frage Stackoverflow hier, die einige Hinweise darauf, wie gibt statisch die Laufzeitbibliotheken zu verknüpfen, so dass Sie die verteilbaren DLLs nicht benötigen installiert werden.

Danke, Tom. Ich versuche das, aber ich bekomme eine Reihe neuer Fehler beim Kompilieren wie "unaufgelöstes externes Symbol __malloc_dbg". aswine vor 8 Jahren 0
Wenn diese Antwort Ihre Frage nicht vollständig beantwortet hat, sollte sie nicht akzeptiert werden. Wenn Sie diese Antwort akzeptieren, geben Sie an, dass Ihr Problem gelöst ist Ramhound vor 8 Jahren 0