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

时间:2013-05-15 15:00:18

标签: 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位之间存在不一致。

当我使用g++ -m32 test.cpp

编译为32位时

依赖关系是:

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

当我使用g++ -m64 test.cpp

编译为64位时

依赖项仅限于:

  • KERNEL32.DLL
  • MSVCRT.DLL

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

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

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

我尝试了-shared-libgcc-shared-libstdc++,这样我的64位编译就会对LIBGCCLIBSTDC++产生动态依赖,但g ++在使用{{{}}时拒绝动态链接这些1}}标志(编译为64位)。

我已经读过,静态链接–m64LIBGCC是件坏事,并且它会阻止人们安全地链接到其他第三方动态库中(因为某些东西)了解索赔)。

如果有人能够阐明这种g ++行为的差异以及这方面的最佳做法,我真的很感激。

1 个答案:

答案 0 :(得分: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位做同样的事情。