it-swarm.com.de

MinGW .exe benötigt einige gcc-DLLs unabhängig vom Code?

Beim Kompilieren mit MinGW muss ich bestimmte DLL-Dateien aus dem MinGW-Bin-Verzeichnis kopieren, bevor das Exe ausgeführt wird (auch wenn "-static" und/oder "-static-libstdc ++" verwendet wird.) Wie ändere ich das ? Gibt es eine spezielle Version von MinGW, die ich verwenden muss? Letztendlich möchte ich in der Lage sein, das Programm mit nur der Exe im Verzeichnis (und ohne Windows-Umgebungsvariablen) auszuführen. Diese Dateien sind:

  • libstdc ++ - 6.dll
  • libgcc_s_seh-1.dll
  • libwinpthread-1.dll

Und hier ist die vollständige Liste der I-Brache:

  1. Öffnen Sie Code :: Blocks
  2. Wählen Sie "Datei-> Neu-> Projekt-> Konsole".
  3. Füllen Sie die Projekteinstellungen für das Projekt "Hello World" aus
  4. Klicken Sie mit der rechten Maustaste auf Projekt-> Erstellungsoptionen ... -> Hallo Welt (Stammziel) -> Andere Optionen
  5. Geben Sie "-static" (oder "-static-libstdc ++") unter den bereits festgelegten "-fexceptions" ein
  6. STRG-F9: Projekt erstellen (ohne Ausführen)
  7. Navigieren Sie in Windows Explorer zu und führen Sie die erstellte Datei "Hello World.exe" aus.
  8. Klicken Sie auf "OK", wenn eine Meldung erscheint, dass "Fehler: libstdc ++ - 6.dll von Ihrem Computer fehlt."
  9. Kopieren Sie "libstdc ++ - 6.dll" aus dem Verzeichnis/MinGW/bin/in das Verzeichnis "Hello World.exe".
  10. "Hello World.exe" ausführen
  11. Klicken Sie auf "OK" für die Meldung "Fehler: libgcc_s_seh-1.dll fehlt auf Ihrem Computer."
  12. Kopieren Sie "libgcc_s_seh-1.dll" in das Verzeichnis "Hello World.exe".
  13. Wiederholen Sie das Kopieren von "libwinpthread-1.dll".
  14. Nachricht anzeigen

    Hello World!
    

Edit: Meine Befehlszeile ist:

g++.exe -Wall -fexceptions -static -static-libgcc -static-libstdc++ -g -static-libgcc -static-libstdc++ -L. -c "C:\Users\______\Desktop\Hello World\main.cpp" -o obj\Debug\main.o
g++.exe -o "bin\Debug\Hello World.exe" obj\Debug\main.o

Mit allen oben genannten DLL-Dateien. Und um sicherzugehen, lautet der Code:

// main.cpp
#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
46
Wolfgang Skyler

Deine Befehle sind falsch!

Wechseln Sie in das Verzeichnis, in dem sich Ihre Datei main.cpp befindet, und versuchen Sie Folgendes.

g++.exe -Wall -c -g main.cpp -o obj\Debug\main.o
g++.exe -static -static-libgcc -static-libstdc++ -o "bin\Debug\Hello World.exe" obj\Debug\main.o

dann müssen Sie die DLLs nicht mehr kopieren (für Ihr Hello World-Programm).

Weitere Hinweise:

Die MinGW-Installationsanleitung empfiehlt die Einstellung

c:\minGW;c:\MinGW\bin;

auf die Umgebungsvariable PATH.

Normalerweise die

-static -static-libgcc -static-libstdc++

linker-Optionen sollten funktionieren (probieren Sie alle drei auf einmal). Nicht jedoch für libwinpthread-1.dll.

Versuchen Sie auch, clean vor dem erneuten Kompilieren.

Es gibt keinen "statischen-etwas" -Befehl.

Nur die Standardbibliotheken libgcc und libstdc ++ können auf statische Verknüpfung gesetzt werden.

Bei anderen Bibliotheken wechseln Sie zunächst zur statischen Verknüpfung mit "-static" und listen dann die Bibliotheken auf, die mit separaten Befehlen, d. H. "-Lpthread", eingeschlossen werden sollen.

Cmake-Benutzer sollten versuchen, Folgendes hinzuzufügen:

set(CMAKE_CXX_STANDARD_LIBRARIES "-static-libgcc -static-libstdc++ -lwsock32 -lws2_32 ${CMAKE_CSS_STANDARD_LIBRARIES}")

set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive")
39
moskito-x

-static-libgcc kann eine schlechte Idee sein, wenn Ausnahmen verwendet werden. Link-Optionsdokumentation besagt,

Es gibt mehrere Situationen, in denen eine Anwendung die .__ verwenden sollte. Shared Libgcc anstelle der statischen Version. Die häufigsten davon ist, wenn die Anwendung Ausnahmen über .__ werfen und fangen möchte. verschiedene gemeinsam genutzte Bibliotheken. In diesem Fall wird jede der Bibliotheken als sowie die Anwendung selbst sollte die gemeinsam genutzte libgcc verwenden.

7
J.J. Hakala

Die Leute verharrten immer noch bei diesem Problem. In Code :: Blocks wird versucht, das Projekt neu zu erstellen. Ich hatte das gleiche Problem, aber der Wiederaufbau meines Projekts half, das Problem zu lösen.

0
Uwohm9