在 Windows 7 64 位中,我使用的是 MinGW-w64(来自 MinGW-build 项目,由 NiXman 打包)。具体来说,我使用的是 x64-4.8.0-release-win32-sjlj-rev2.7z
。 x64 = 开发机器。 Win32= 线程模型。这可以编译 32 位和 64 位目标。
当我编译并清空 cpp 文件时,只有一个普通的 cp main 和一个 printf 行打招呼......我将它编译为 32 位还是 64 位之间存在不一致。
当我使用 g++ -m32 test.cpp
编译为 32 位时
依赖项是:
- LIBGCC_S_SJLJ-1.DLL
- LIBSTDC++-6.DLL
- KERNEL32.DLL
- MSVCRT.DLL
当我使用 g++ -m64 test.cpp
编译为 64 位时
依赖项只有:
- 内核32.DLL
- MSVCRT.DLL
当我在 64 位模式下编译时,我不明白 LIBGCC_S_SJLJ-1
和 LIBSTDC++-6
依赖项的情况。 64 位 C++ 编译不需要这两个东西……还是它们会自动静态链接?
如果它们自动链接到其中一个而不是另一个,这是什么原因?
我知道我可以使用 -static-libgcc
和 -static-libstdc++< 为 32 位项目静态链接
。虽然我不确定这是不是好习惯。 LIBGCC
和 LIBSTDC++
我尝试了 -shared-libgcc
和 -shared-libstdc++
这样我的 64 位编译就会动态依赖于 LIBGCC
和 LIBSTDC++
但 g++ 在使用 –m64
标志(编译为 64 位)时拒绝动态链接它们。
我读过静态链接 LIBGCC
和 LIBSTDC++
是一件坏事,它会阻止人们安全地链接其他第 3 方动态库,因为某些原因(我真的不明白这个说法)。
如果有人能阐明 g++ 行为中的这种差异以及这方面的最佳实践是什么,我将不胜感激。
最佳答案
阅读此 http://sourceforge.net/apps/trac/mingw-w64/wiki/Native%20Win64%20compiler向我建议 native 编译器是使用 --disable-shared 标志构建的,并且依赖项静态链接到您的应用程序中。他们当然是必需的。
异常处理需要LIBGCC_S_SJLJ-1.DLL,LIBSTDC++-6.DLL是C++标准库。
我不清楚为什么会有 32/64 的差异。可能是因为后端是用不同的标志生成的。
我没有看到静态链接这些依赖项的真正问题,事实上,该决定是针对 64 位做出的。我会为 32 位做同样的事情。
关于c++ - g++ 32 位与 64 位编译中的动态与静态链接差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16568517/