g ++ dynamische vs statische Linking Diskrepanz in 32bit vs 64bit-Zusammenstellungen

9

In Windows 7 64bit verwende ich MinGW-w64 (aus MinGW-Build-Projekt, Paket von NiXman). Insbesondere verwende ich x64-4.8.0-release-win32-sjlj-rev2.7z . x64 = Entwicklungsmaschine. Win32 = Threading-Modell. Dies kann sowohl 32-Bit- als auch 64-Bit-Ziele kompilieren.

Wenn ich cpp-Datei kompilieren und leeren, nur mit einer einfachen cp-Hauptdatei und einer printf-Zeile, die hallo sagt, besteht eine Inkonsistenz zwischen der Frage, ob ich sie als 32-Bit oder 64-Bit kompiliere.

Wenn ich als 32bit mit g++ -m32 test.cpp kompiliere

Die Abhängigkeiten sind:

  • LIBGCC_S_SJLJ-1.DLL
  • LIBSTDC ++ - 6.DLL
  • KERNEL32.DLL
  • MSVCRT.DLL

Wenn ich als 64bit mit g++ -m64 test.cpp kompiliere

Die Abhängigkeiten sind nur:

  • KERNEL32.DLL
  • MSVCRT.DLL

Ich verstehe nicht, was die Situation mit den Abhängigkeiten LIBGCC_S_SJLJ-1 und LIBSTDC++-6 ist, wenn ich im 64-Bit-Modus kompiliere. Werden diese beiden Dinge nicht für 64-Bit-C ++ - Zusammenstellungen benötigt oder sind sie automatisch statisch verknüpft?

Wenn sie automatisch für die eine, aber nicht für die andere verknüpft sind, was ist der Grund dafür?

Ich weiß, dass ich LIBGCC und LIBSTDC++ statisch für 32bit Projekte mit -static-libgcc und -static-libstdc++ verknüpfen kann. Obwohl ich nicht sicher bin, ob das eine gute Übung ist oder nicht.

Ich probierte -shared-libgcc und -shared-libstdc++ , so dass meine 64-Bit-Kompilierung eine dynamische Abhängigkeit von LIBGCC und LIBSTDC++ hat, aber g ++ verweigert diese dynamisch zu verknüpfen, wenn das –m64 -Flag verwendet wird (kompiliert als 64bit).

Ich habe gelesen, dass das statische Verknüpfen von LIBGCC und LIBSTDC++ eine schlechte Sache ist und dass es Leute daran hindert, in anderen dynamischen Bibliotheken von Drittanbietern sicher zu verlinken (ich habe die Behauptung nicht verstanden). .

Ich würde es sehr schätzen, wenn jemand diese Diskrepanz im Verhalten von g ++ beleuchten könnte und was die beste Praxis in dieser Hinsicht ist.

    
user1118167 15.05.2013, 15:00
quelle

1 Antwort

1

Das Lesen dieses Ссылка deutet darauf hin, dass der native Compiler erstellt wurde mit --disable-shared Flag und die Abhängigkeiten sind statisch in Ihre Anwendung eingebunden. Sie sind sicherlich erforderlich.

LIBGCC_S_SJLJ-1.DLL ist erforderlich, um Ausnahmen zu behandeln, und LIBSTDC ++ - 6.DLL ist die C ++ - Standardbibliothek.

Ich bin nicht klar, warum es einen 32/64 Unterschied gibt. Möglicherweise weil die Backends mit verschiedenen Flags generiert wurden.

Ich sehe kein echtes Problem mit der statischen Verknüpfung dieser Abhängigkeiten, in der Tat wurde die Entscheidung in Bezug auf 64 Bit getroffen. Ich würde das gleiche für 32 Bit tun.

    
Montdidier 24.06.2013 03:03
quelle

Tags und Links