Qt基础应用重链接出现链接器错误的排查求助
这问题我之前折腾MinGW链接Qt项目时也碰到过,核心原因不是C++11标志的问题,而是你直接调用底层链接器ld的方式不对——C代码的链接不能直接用ld,得用g++来触发,或者手动补全所有C标准库、异常/RTTI相关的依赖。
为什么会出现这些未定义引用?
ld是纯底层的链接器,它只会链接你明确指定的文件和库。但C++代码编译后,依赖的远不止你指定的Qt库:
_Unwind_Resume和__gxx_personality_v0是C++异常处理需要的符号,来自GCC的异常支持库libgcc_sstrcmp是C标准库的函数,来自libcvtable for __xyyabiv1::__class_type_info这类RTTI相关的符号,来自C++标准库libstdc++
你直接用ld时,没有告诉它要链接这些库,所以就会出现未定义引用的错误。而qmake生成的Makefile里,链接步骤是调用g++而不是ld——g++会自动帮你添加这些必要的依赖库和链接选项,所以编译没问题。
具体解决办法
方法1:用g++代替ld执行链接(推荐)
把你手动链接的命令换成g++,它会自动处理所有C++相关的依赖:
C:\Qt\Qt5.9.1\Tools\mingw530_32\bin\g++ -o test release\main.o -LC:\Qt\Qt5.9.1\5.9.1\mingw53_32\bin -lQt5Core --verbose > ld_dump.txt
不管是控制台项目还是带QtWidgets的复杂项目,用这个命令都能自动补上缺失的标准库、异常处理、RTTI相关的依赖,解决那些未定义引用的错误。
方法2:如果一定要用ld,手动添加所有依赖库
如果你坚持要用ld,需要手动指定所有依赖的库,顺序也很重要(一般把依赖的库放在目标文件后面):
C:\Qt\Qt5.9.1\Tools\mingw530_32\bin\ld -o test release\main.o -LC:\Qt\Qt5.9.1\5.9.1\mingw53_32\bin -lQt5Core -lstdc++ -lgcc_s -lc --verbose > ld_dump.txt
-lstdc++:链接C++标准库-lgcc_s:链接GCC异常处理支持库-lc:链接C标准库
不过这种方式很容易遗漏依赖(比如不同版本MinGW可能还有其他隐含依赖),所以还是推荐用g++来做链接。
关于C++11的补充说明
你项目里的CONFIG += c++11是编译阶段的选项,告诉qmake在编译main.cpp时添加-std=c++11(MinGW下实际是-std=gnu++11)标志,和链接阶段的库依赖关系不大。只要编译和链接用的是同一套MinGW工具链,编译时启用了C11,用g++链接就会自动处理对应的标准库版本,不需要额外给链接器传C11相关的标志。
内容的提问来源于stack exchange,提问作者user2366975
相关产品推荐
相关产品推荐

