You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt基础应用重链接出现链接器错误的排查求助

这问题我之前折腾MinGW链接Qt项目时也碰到过,核心原因不是C++11标志的问题,而是你直接调用底层链接器ld的方式不对——C代码的链接不能直接用ld,得用g++来触发,或者手动补全所有C标准库、异常/RTTI相关的依赖。

为什么会出现这些未定义引用?

ld是纯底层的链接器,它只会链接你明确指定的文件和库。但C++代码编译后,依赖的远不止你指定的Qt库:

  • _Unwind_Resume和__gxx_personality_v0是C++异常处理需要的符号,来自GCC的异常支持库libgcc_s
  • strcmp是C标准库的函数,来自libc
  • vtable 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:14:21