Wie erstelle ich mit Visual Studio Express 2005 eine vollständig statisch verknüpfte EXE-Datei?

StackOverflow https://stackoverflow.com/questions/37398

  •  09-06-2019
  •  | 
  •  

Frage

Meine derzeit bevorzugte C++-Umgebung ist die kostenlose und weitgehend hervorragende Microsoft Visual Studio 2005 Express Edition.Von Zeit zu Zeit habe ich Release-.exe-Dateien mit erfreulichen Ergebnissen an andere Leute gesendet.Kürzlich machte ich jedoch die beunruhigende Entdeckung, dass die erfreulichen Ergebnisse auf mehr Glück beruhten, als ich mir gewünscht hätte.Beim Versuch, eines dieser Programme auf einem alten XP-Rechner (Baujahr 2001, nicht sorgfältig aktualisiert) auszuführen, bekam ich nur die unangenehme Meldung „System kann x.exe nicht ausführen“ (oder eine ähnliche Meldung).

Beim Googeln stellte sich heraus, dass bei diesem Toolset selbst die Angabe einer statischen Verknüpfung dazu führt, dass eine einfache hello-world.exe tatsächlich auf zusätzliche DLL-Dateien (msvcm80.dll usw.) angewiesen ist.Ein unglaublich ausgefeiltes Versionsplanungssystem (jemand Manifestdateien?) lässt die EXE-Datei dann nicht ohne genau die richtigen DLL-Versionen laufen.Ich möchte oder brauche dieses Zeug nicht, ich möchte nur eine altmodische eigenständige EXE-Datei, die nichts anderes als Win32-Operationen mit dem kleinsten gemeinsamen Nenner ausführt und auf jedem alten Win32-Betriebssystem läuft.

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

Danke schön.

War es hilfreich?

Lösung

Gehen Sie für die C-Laufzeit zu den Projekteinstellungen, wählen Sie C/C++ und dann „Codegenerierung“.Ändern Sie die Einstellung „Laufzeitbibliothek“ in „Multithreaded“ anstelle von „Multithreaded DLL“.

Wenn Sie andere Bibliotheken verwenden, müssen Sie den Linker möglicherweise explizit anweisen, die dynamisch verknüpfte CRT zu ignorieren.

Andere Tipps

Meine Erfahrung in Visual Studio 2010 zeigt, dass zwei Änderungen erforderlich sind, um keine DLLs zu benötigen.Auf der Projekteigenschaftenseite (klicken Sie mit der rechten Maustaste auf den Projektnamen im Projektmappen-Explorer-Fenster):

  1. Ändern Sie unter Konfigurationseigenschaften -> Allgemein das Feld „Verwendung von MFC“ in „MFC in einer statischen Bibliothek verwenden“.

  2. Ändern Sie unter Konfigurationseigenschaften -> C/C++ -> Codegenerierung das Feld „Laufzeitbibliothek“ in „Multithreaded (/MT)“.

Ich bin mir nicht sicher, warum beides nötig war.Ich habe dies verwendet, um eine Abhängigkeit von glut32.dll zu entfernen.

Später hinzugefügt:Wenn Sie diese Änderungen an den Konfigurationen vornehmen, sollten Sie sie auf „Alle Konfigurationen“ einstellen – Sie können dies oben im Eigenschaftenfenster auswählen.Wenn Sie die Änderung nur an der Debug-Konfiguration vornehmen, gilt sie nicht für die Release-Konfiguration und umgekehrt.

Ich hatte das gleiche Abhängigkeitsproblem und weiß auch, dass Sie die VS 8.0-DLLs einbinden können (nur Release!).nicht debuggen!---und Ihr Programm muss auch veröffentlicht werden) in einem Ordner mit dem entsprechenden Namen, im übergeordneten Ordner mit Ihrer .exe:

Wie man:Bereitstellung mit XCopy (MSDN)

Beachten Sie außerdem, dass die Dinge garantiert schief gehen, wenn Sie C++- und C-Code in derselben statisch verknüpften EXE-Datei benötigen, da es zu Linkerkonflikten kommt, die nur gelöst werden können, indem Sie die richtige libXXX.lib ignorieren und dann dynamisch verknüpfen (DLLs). .

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

Was Jareds Antwort betrifft: Windows 2000 oder höher wird das vorliegende Problem nicht unbedingt beheben.Robs Antwort funktioniert zwar, es ist jedoch möglich, dass dieser Fix Sicherheitsprobleme mit sich bringt, da Windows-Updates nicht in der Lage sind, als solche erstellte Anwendungen zu patchen.

In einem anderen Beitrag schlägt Nick Guerrera vor, Visual C++ Runtime Redistributable in Ihre Anwendungen zu packen, was schnell installiert werden kann und unabhängig von Visual Studio ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top