c++ - g++ 32 位与 64 位编译中的动态与静态链接差异

标签 c++ qt g++

在 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-1LIBSTDC++-6 依赖项的情况。 64 位 C++ 编译不需要这两个东西……还是它们会自动静态链接?

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

我知道我可以使用 -static-libgcc-static-libstdc++< 为 32 位项目静态链接 LIBGCCLIBSTDC++。虽然我不确定这是不是好习惯。

我尝试了 -shared-libgcc-shared-libstdc++ 这样我的 64 位编译就会动态依赖于 LIBGCCLIBSTDC++ 但 g++ 在使用 –m64 标志(编译为 64 位)时拒绝动态链接它们。

我读过静态链接 LIBGCCLIBSTDC++ 是一件坏事,它会阻止人们安全地链接其他第 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/

相关文章:

C++ 类在另一个类中初始化,出现错误

c++ - 使用事件过滤器(嵌入式 linux)区分 2 个键盘击键

c++ - Qt Tcp Socket - 一次接收多个发送

qt - QSortFilterProxyModel : retrieve the item or index of the original model

c++ - QStringListModel排序

c++ - 为什么我的回调没有被调用?

c++ - 如何正确处理 SIGBUS 以便我可以继续搜索地址?

C++ 和 pulseaudio "not declared in this scope"

c++ - 未定义的 vtable 引用

c++ - 如何在 C++ OpenGL 应用程序中播放 FLV 文件?