9

在 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++-664 位 C++ 编译不需要这两件事……还是它们会自动静态链接?

如果它们自动链接到一个而不是另一个,这是什么原因?

我知道我可以使用LIBGCC和静态链接 32位LIBSTDC++项目。虽然我不确定这是否是好的做法。 -static-libgcc-static-libstdc++

我尝试过-shared-libgcc-shared-libstdc++以便我的 64 位编译将动态依赖LIBGCC,但 g++ 在使用标志LIBSTDC++时拒绝动态链接这些(编译为 64 位)。–m64

我读过静态链接是一件坏事,它会阻止人们因为某些原因安全地链接到其他 3rd 方动态库(我并不真正理解这种说法)LIBGCCLIBSTDC++

如果有人能阐明 g++ 行为中的这种差异以及在这方面的最佳实践是什么,我将不胜感激。

4

1 回答 1

1

阅读此http://sourceforge.net/apps/trac/mingw-w64/wiki/Native%20Win64%20compiler向我表明本机编译器已使用 --disable-shared 标志构建,并且依赖项静态链接到您的应用。它们当然是必需的。

处理异常需要LIBGCC_S_SJLJ-1.DLL,LIBSTDC++-6.DLL是C++标准库。

我不清楚为什么会有 32/64 的差异。可能是因为后端是使用不同的标志生成的。

我认为静态链接这些依赖项没有真正的问题,事实上,决定是针对 64 位的。我会为 32 位做同样的事情。

于 2013-06-24T03:03:17.250 回答