Mac平台Qt编译WebRTC原生库时出现x86_64架构未定义符号链接错误
解决Qt Creator中WebRTC项目x86_64架构未定义符号链接错误
我之前在Mac上折腾WebRTC和Qt链接的时候也踩过一模一样的坑,结合你的环境参数,给你几个针对性的排查和解决方向:
1. 确保WebRTC编译架构与Qt项目完全对齐
WebRTC的gn gen命令必须明确指定x86_64架构,同时匹配你的MacOS Sierra 10.12.6系统版本,参数建议这样写:
gn gen out/Release --args='target_os="mac" target_cpu="x86_64" is_debug=false use_sysroot=false mac_deployment_target="10.12" use_custom_libcxx=false use_system_libcxx=true'
这里要盯紧两个关键配置:
use_system_libcxx=true必须和Qt项目里的**链接libc++**选项完全对应mac_deployment_target要和Qt Creator项目构建设置里的Deployment Target保持一致(可以在QMake变量或Build Environment里找到)
2. 检查Qt项目的链接配置是否完整正确
WebRTC编译后会生成一堆依赖紧密的静态库,你需要在Qt的.pro文件里把所有用到的库按依赖顺序添加(上层库放后面,底层依赖放前面),比如:
LIBS += -L/path/to/webrtc/out/Release/lib \ -lrtc_base \ -lrtc_pc \ -lrtc_video \ -lrtc_audio \ -lwebrtc \ -lprotobuf \ -lyuv # 其他子库根据你代码用到的WebRTC模块补充
同时要确保Qt的编译参数和WebRTC对齐,在.pro里添加:
QMAKE_CXXFLAGS += -std=c++11 -stdlib=libc++ QMAKE_LFLAGS += -stdlib=libc++
3. 定位具体缺失符号的根源
把链接错误里的未定义符号拷贝出来,分两种情况排查:
- 用
nm命令检查WebRTC库是否包含该符号:
如果找不到,说明你编译WebRTC时关闭了对应模块(比如用到H.264就要加nm -gU /path/to/webrtc/out/Release/lib/libwebrtc.a | grep "你的缺失符号名"rtc_use_h264=true到gn参数里);如果能找到,那就是Qt项目的链接顺序或依赖库遗漏了。 - 检查是否因为C++名称修饰不一致导致:WebRTC和Qt都是用Clang编译的,这里大概率没问题,但要确保两者的
-fvisibility编译选项一致,WebRTC默认隐藏符号,你可以加symbol_level=2到gn参数生成完整符号表验证。
4. 清理缓存重新编译
有时候缓存会导致各种诡异问题:
- 清空Qt Creator的项目构建目录,重新执行qmake和构建
- 删除WebRTC的
out编译目录,重新用gn gen和ninja编译一次
内容的提问来源于stack exchange,提问作者Denys Yamkovyi
相关产品推荐
相关产品推荐

