不同操作系统下不同版本MinGW交叉编译静态链接差异咨询
交叉编译问题解答
1. 当前操作是否正确
你当前的编译操作符合规范:
- 提前定义
IBPP_WINDOWS宏适配Windows平台 - 直接编译IBPP的
all_in_one.cpp整合源码的用法是IBPP官方推荐的使用方式,操作逻辑没有错误。
2. 两个环境编译差异的原因
差异完全是由两个发行版提供的MinGW工具链的配置、版本不同导致的,和操作系统本身没有直接关联:
- Ubuntu 21.04提供的MinGW GCC 10采用win32线程模型:线程逻辑直接调用Windows原生API实现,不依赖pthread库,所以添加
--static参数可以正常完成全静态编译。不加--static时会动态依赖libgcc、libstdc++等运行时库,因此Windows运行会提示缺少DLL。 - CentOS Stream 8提供的MinGW GCC 7.2采用posix线程模型:线程逻辑基于winpthread库实现,而该版本的MinGW包没有预装静态版本的pthread库,因此添加
--static参数时链接器无法找到静态pthread库,直接报错。
3. CentOS下不加--static的运行隐患
存在运行隐患:
不加--static生成的可执行文件默认动态链接MinGW运行时库,你测试时能正常运行是因为当前测试的Windows环境已经预装了对应的运行时组件,如果将程序放到纯净的Windows环境运行,大概率会提示缺少libstdc++-6.dll、libgcc_s_seh-1.dll、libwinpthread-1.dll等依赖文件,导致程序启动失败。
4. CentOS下实现无DLL依赖的编译方案
不需要全量静态链接,只需要静态链接C/C++运行时即可避免依赖运行时DLL,同时不会触发pthread的链接错误,编译命令调整为:
x86_64-w64-mingw32-g++ -Wall -DIBPP_WINDOWS con_test.cpp ibpp/core/all_in_one.cpp -o con_test.exe -static-libgcc -static-libstdc++
如果确实需要全静态编译,可以自行编译更高版本(8.0+)的posix线程模型MinGW工具链,高版本默认会携带静态版本的winpthread库,可支持全静态编译。
内容的提问来源于stack exchange,提问作者Namal
相关产品推荐
相关产品推荐

