gbit动态与静态链接差异在32位与64位编译中

use*_*167 9 c++ qt g++

在Windows 7 64bit中,我使用MinGW-w64(来自MinGW-build项目,由NiXman提供).具体来说,我正在使用x64-4.8.0-release-win32-sjlj-rev2.7z.x64 =开发机器.Win32 =线程模型.这可以编译32位和64位目标.

当我编译并清空cpp文件时只有一个简单的cp main和一个printf行说你好...我是否将它编译为32位或64位之间存在不一致.

当我编译为32位时 g++ -m32 test.cpp

依赖关系是:

  • LIBGCC_S_SJLJ-1.DLL
  • 的libstdc ++ - 6.DLL
  • KERNEL32.DLL
  • MSVCRT.DLL

当我编译为64位时 g++ -m64 test.cpp

依赖关系只是:

  • KERNEL32.DLL
  • MSVCRT.DLL

在64位模式下编译时,我不明白LIBGCC_S_SJLJ-1LIBSTDC++-6依赖项有什么关系.64位C++编译不需要这两件事吗?或者它们是否自动静态链接?

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

我知道我可以用and LIBGCCLIBSTDC++静态链接32位项目.虽然我不确定这是不是很好的做法. -static-libgcc-static-libstdc++

我尝试过-shared-libgcc,-shared-libstdc++以便我的64位编译具有动态依赖性LIBGCC,LIBSTDC++但是当使用–m64标志(编译为64位)时,g ++拒绝动态链接它们.

我已经读过静态链接LIBGCC,这LIBSTDC++是一件坏事,并且它会阻止人们安全地链接到其他第三方动态库中,因为某些东西(我并不真正理解这个说法).

如果有人能够阐明g ++行为的这种差异以及这方面的最佳实践,我将非常感激.

Mon*_*ier 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 位我也会做同样的事情。