2008-09-01 7 views
78

Meine aktuelle bevorzugte C++ - Umgebung ist die kostenlose und weitgehend ausgezeichnete Microsoft Visual Studio 2005 Express Edition. Von Zeit zu Zeit habe ich freigegebene EXE-Dateien mit erfreulichen Ergebnissen an andere Personen gesendet. In letzter Zeit machte ich jedoch die beunruhigende Entdeckung, dass die erfreulichen Ergebnisse auf mehr Glück beruhten, das mir gefallen würde. Der Versuch, eines dieser Programme auf einer alten XP-Box zu starten, gab mir nichts als eine böse "System kann nicht x.exe laufen" (oder eine ähnliche) Nachricht.Wie mache ich eine vollständig statisch verknüpfte .exe mit Visual Studio Express 2005?

Einige googeln ergab, dass mit diesem Toolset, selbst Angabe der statischen Verknüpfung in einer einfachen hallo-world.exe tatsächlich zusätzliche DLL-Dateien (msvcm80.dll usw.). Ein unglaublich ausgeklügeltes Versions-Schemasystem (manifest files anyone?) Lässt dann die .exe-Datei nicht ohne die richtigen .dll-Versionen laufen. Ich will oder brauche dieses Zeug nicht, ich will nur ein altmodisches, selbständiges .exe, das nichts als den kleinsten gemeinsamen Nenner von Win32-Operationen macht und auf jedem alten win32-Betriebssystem läuft.

Weiß jemand, ob es möglich ist, zu tun, was ich mit meinem vorhandenen Toolset machen möchte?

Vielen Dank.

Antwort

95

Für die C-Laufzeit gehen Sie zu den Projekteinstellungen, wählen Sie C/C++ und dann 'Codegenerierung'. Ändern Sie die Einstellung "Laufzeitbibliothek" in "Multithread" anstelle von "Multithread-DLL".

Wenn Sie andere Bibliotheken verwenden, müssen Sie dem Linker möglicherweise mitteilen, dass er die dynamisch verknüpfte CRT explizit ignoriert.

+0

"Wenn Sie andere Bibliotheken verwenden, müssen Sie dem Linker möglicherweise mitteilen, dass er die dynamisch verknüpfte CRT explizit ignoriert." Kürzlich bin ich auf dieses Problem gestoßen. Ich baute eine wxWidgets-App, ich fand, dass ich die wxWidgets-Bibliotheken mit der gleichen Codegenerierungsänderung neu erstellen musste –

+6

Mann 300 Zeichen ist nicht viele. Wenn der obige Kommentar unklar ist, besteht das Problem darin, dass sowohl Ihre .cpp-Dateien als auch alle .cpp-Bibliotheksdateien "Multithread" anstelle von "Multithread-DLL" haben müssen, da sonst Linkfehler auftreten können. –

+0

Dies führt zu zahlreichen Problemen bei der Heap-Verwaltung, mit denen Sie wahrscheinlich nichts zu tun haben wollen. –

4

Ich hatte das gleiche Abhängigkeitsproblem und ich weiß auch, dass Sie die VS 8.0 DLLs (nur Release! Nicht debuggen! --- und Ihr Programm muss auch Release sein) in einem Ordner der entsprechenden enthalten Name, in den übergeordneten Ordner mit Ihrem .exe:

How to: Deploy using XCopy (MSDN)

beachten Sie auch, dass die Dinge sind garantiert schief gehen, wenn Sie C++ und C-Code in der gleichen statisch gelinkte .exe haben müssen, weil Sie Linker erhalten Konflikte, die nur durch Ignorieren der korrekten libXXX.lib und anschließendes dynamisches Verknüpfen (DLLs) behoben werden können.

Schließlich, mit einem anderen Toolset (VC++ 6.0) Dinge "einfach funktionieren", seit Windows 2000 und höher haben die richtigen DLLs installiert.

1

In Bezug auf Jareds Antwort wird Windows 2000 oder besser nicht unbedingt das Problem beheben. Die Antwort von Rob funktioniert, es ist jedoch möglich, dass dieser Fix Sicherheitsprobleme verursacht, da Windows-Updates keine Anwendungen reparieren können, die als solche erstellt wurden.

In einem anderen Beitrag schlägt Nick Guerrera vor, die Visual C++ Runtime Redistributable mit Ihren Anwendungen zu verpacken, die schnell installiert wird und unabhängig von Visual Studio ist.

+2

Während das Paketieren des Redistributors die bevorzugte Lösung zu sein scheint, benötigen Sie admin privs, um das Redistributable-Installationsprogramm auszuführen. Dies ist keine praktikable Option, wenn Sie Benutzer ohne Administratorrechte haben. –

4

Meine Erfahrung in Visual Studio 2010 ist, dass zwei Änderungen benötigt werden, um keine DLLs zu benötigen. Von der Projekteigenschaftenseite (Rechtsklick auf den Projektnamen im Fenster Projektmappen-Explorer):

  1. unter Konfigurationseigenschaften -> Allgemein, die „Verwendung von MFC“ Feld in einer statischen Bibliothek zu „Use MFC ändern ".

  2. unter Konfigurationseigenschaften -> C/C++ -> Code-Generierung, ändern Sie das "Runtime Library" Feld "Multi-Threaded (/ MT)"

nicht sicher, warum beide gebraucht wurden . Ich habe dies verwendet, um eine Abhängigkeit von glut32.dll zu entfernen.

+0

Danke. Rettete mein Leben. :) –

Verwandte Themen