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

Lesezeit: 4 Minuten

Wie erstelle ich eine vollstandig statisch verknupfte EXE Datei mit Visual
Bill Förster

Meine derzeit bevorzugte C++-Umgebung ist die kostenlose und weitgehend ausgezeichnete Microsoft Visual Studio 2005 Express Edition. Von Zeit zu Zeit habe ich Release-.exe-Dateien mit erfreulichen Ergebnissen an andere Personen gesendet. Kürzlich machte ich jedoch die beunruhigende Entdeckung, dass die erfreulichen Ergebnisse auf mehr Glück beruhten, als ich gerne hätte. Der Versuch, eines dieser Programme auf einer alten XP-Box (Jahrgang 2001, nicht gewissenhaft aktualisiert) auszuführen, brachte mir nichts als eine unangenehme Meldung “System kann x.exe nicht ausführen” (oder eine ähnliche) Meldung.

Einiges Googeln ergab, dass mit diesem Toolset selbst die Angabe statischer Verknüpfungen zu einer einfachen hello-world.exe führt, die sich tatsächlich auf zusätzliche .dll-Dateien (msvcm80.dll usw.) stützt. Ein unglaublich ausgeklügeltes Versionsschemasystem (offensichtliche Dateien irgendjemand?) lässt die .exe dann nicht ohne genau die richtigen .dll-Versionen laufen. Ich will oder brauche dieses Zeug nicht, ich will nur eine altmodische, eigenständige EXE-Datei, die 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, das zu tun, was ich mit meinem vorhandenen Toolset tun möchte?

Danke.

Für die C-Laufzeit gehen Sie zu den Projekteinstellungen, wählen Sie C/C++ und dann ‘Code Generation’. Ändern Sie die Einstellung „Laufzeitbibliothek“ in „Multithreaded“ anstelle von „Multithreaded DLL“.

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

  • “Wenn Sie andere Bibliotheken verwenden, müssen Sie dem Linker möglicherweise mitteilen, dass er die dynamisch verknüpfte CRT explizit ignorieren soll.” Kürzlich bin ich auf dieses Problem gestoßen. Ich habe eine wxWidgets-App erstellt und festgestellt, dass ich die wxWidgets-Bibliotheken mit derselben Codegenerierungsänderung neu erstellen musste

    – Bill Förster

    12. November 2008 um 2:55 Uhr

  • Mann 300 Zeichen sind nicht viel. Falls der obige Kommentar unklar ist, besteht das Problem darin, dass sowohl Ihre .cpp-Dateien als auch alle .cpp-Bibliotheksdateien „multithreaded“ anstelle von „multithreaded dll“ haben müssen, da Sie sonst möglicherweise Verknüpfungsfehler erhalten.

    – Bill Förster

    12. November 2008 um 2:57 Uhr

  • Dies führt zu zahlreichen Problemen in Bezug auf die Heap-Verwaltung, mit denen Sie wahrscheinlich nichts zu tun haben möchten.

    – Edward Seltsam

    14. Februar 2011 um 23:35 Uhr

  • Ich bekomme error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'. Gibt es eine andere Möglichkeit, die Art des Builds zu ändern? Ich baue eine wxWigets-Anwendung, ähnlich wie @BillForster. Werde ich auch müssen wieder aufbauen wxWidgets? Wie mache ich das?

    – Tomáš Zato – Wiedereinsetzung von Monica

    6. Mai 2014 um 14:11 Uhr

  • @EdwardStrange welche Art von Problemen?

    – jrh

    15. September 2020 um 13:07 Uhr

1646909407 250 Wie erstelle ich eine vollstandig statisch verknupfte EXE Datei mit Visual
Sam Busse

Meine Erfahrung in Visual Studio 2010 ist, dass zwei Änderungen erforderlich sind, um keine DLLs zu benötigen. Auf der Projekteigenschaftenseite (Rechtsklick 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 “Multi-Threaded (/MT)”.

Nicht sicher, warum beide benötigt wurden. 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” vornehmen — 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.

  • Dies scheint in Visual Studio 2013 mit einer kleinen Ergänzung zu funktionieren: Ich musste die Konfigurationseigenschaften -> Allgemein -> Zeichensatz auf „Unicode-Zeichensatz verwenden“ ändern.

    – gnovice

    12. September 2018 um 20:30 Uhr

Wie erstelle ich eine vollstandig statisch verknupfte EXE Datei mit Visual
Jared Updike

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 veröffentlicht werden) in einen Ordner mit dem entsprechenden Namen in der übergeordneter Ordner mit Ihrer .exe:

Gewusst wie: Bereitstellen mit XCopy (MSDN)

Beachten Sie auch, dass die Dinge garantiert schief gehen, wenn Sie C++- und C-Code in derselben statisch verknüpften EXE-Datei benötigen, da Sie Linker-Konflikte erhalten, 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 Windows 2000 und höher die richtigen DLLs installiert haben.

In Bezug auf Jareds Antwort wird Windows 2000 oder besser das vorliegende Problem nicht unbedingt beheben. Robs Antwort funktioniert, es ist jedoch möglich, dass dieser Fix Sicherheitsprobleme einführt, da Windows-Updates nicht in der Lage sein werden, Anwendungen zu patchen, die als solche erstellt wurden.

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

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

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy