在 Windows 7 64bit 中,我使用的是 MinGW-w64(来自 MinGW-build 项目,由 NiXman 打包)。具体来说,我正在使用x64-4.8.0-release-win32-sjlj-rev2.7z
. x64 = 开发机器。Win32= 线程模型。这可以编译 32 位和 64 位目标。
当我只用一个普通的 cp main 和一个 printf 行来编译和清空 cpp 文件时,我将它编译为 32 位或 64 位之间存在不一致。
当我编译为 32bit 时g++ -m32 test.cpp
依赖项是:
- LIBGCC_S_SJLJ-1.DLL
- LIBSTDC++-6.DLL
- 内核32.DLL
- MSVCRT.DLL
当我编译为 64 位时g++ -m64 test.cpp
依赖项只有:
- 内核32.DLL
- MSVCRT.DLL
当我在 64 位模式下编译时,我不明白LIBGCC_S_SJLJ-1
和依赖项的情况如何。LIBSTDC++-6
64 位 C++ 编译不需要这两件事……还是它们会自动静态链接?
如果它们自动链接到一个而不是另一个,这是什么原因?
我知道我可以使用LIBGCC
和静态链接 32位LIBSTDC++
项目。虽然我不确定这是否是好的做法。 -static-libgcc
-static-libstdc++
我尝试过-shared-libgcc
,-shared-libstdc++
以便我的 64 位编译将动态依赖LIBGCC
,但 g++ 在使用标志LIBSTDC++
时拒绝动态链接这些(编译为 64 位)。–m64
我读过静态链接是一件坏事,它会阻止人们因为某些原因安全地链接到其他 3rd 方动态库(我并不真正理解这种说法)LIBGCC
。LIBSTDC++
如果有人能阐明 g++ 行为中的这种差异以及在这方面的最佳实践是什么,我将不胜感激。