WebRTC 在 MAC 下的编译及集成 QT 中遇到的问题_webrtc qt 生成 a 文件

102 阅读2分钟

1. 编译WebRTC首先得下载源代码。

  1. 先安装git,mac下安装XCODE自带git
  2. 下载编译工具 depot_tools,
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
  1. 设置环境变量 export PATH=$PATH:pwd/depot_tools
  2. 下载源码
mkdir webrtc-checkout
cd webrtc-checkout
fetch --nohooks webrtc_ios
gclient sync

下载完成后就开始编译工作

1. 编译静态库

gn gen out/mac --args='is_debug=false target_os="mac" target_cpu="x64"' --ide=xcode
ninja -C out/mac AppRTCMobile

2. 合并静态库 ,将编译完的静态库合并为一个. a

mkdir  ./lib
find ./ -name *.a exec cp {} ./lib ;

libtool -static -o libwebrtc-fina.a *.a

编译完之后就可以集成开发了,这里讲的是 QT Creator。

首先把头文件和合并好的. a 拿过来 并添加到工程

INCLUDEPATH += $$PWD/third_party/webrtc/include

LIBS += -L"$$PWD/third_party/webrtc/lib"
-lwebrtc-fina

接下来就可以根据自己的需求开始开发了,这时问题就来了  会有很多

Undefined symbols for architecture x86_64:
"typeinfo for XXX", referenced from:

错误在 link 的时候,第一眼看上去以为是没有引用的静态库,经过查看. a 的符号

nm -a libwebrtc-fina.a

提示 err 的类 静态库中确实包含了。

最后查了很多资料发现 webrtc 默认是关闭了 rtti 导致的,如果想 link 不报错,qt 工程也需要关闭 rtti

QMAKE_CFLAGS = -fno-rtti -pipe
QMAKE_CXXFLAGS = QMAKE_CFLAGS 

设置完这两个参数之后 编译 std 库又会报错 这时要统一 std 库

QMAKE_CXXFLAGS += -std=c++11 -stdlib=libc++
CONFIG += c++11

这时候在 rebuild 工程 ,编译  link 一把过。

网上 webrtc 在 mac 系统和 qt 集成的资料很少 ,希望能帮到遇到同样问题的同学。

关于报错

在mac上使用qt 引入infoplist报ld: unknown option: -no_warn_duplicate_libraries ,原因如下:

  1. 新链接器标志

链接器引入了 -no_warn_duplicate_libraries 标志,用于消除关于重复库的警告。 由于 Xcode 调用 clang,而 clang 再调用链接器(ld),要让这个标志传递给 ld,需要把它作为 clang 参数使用,即:

-Wl,-no_warn_duplicate_libraries
  1. 在 Xcode 中的设置

在 Xcode 中,“其他链接器标志”的原始设置名是 OTHER_LDFLAGS。 通常你会在 Xcode 的配置文件(.xcconfig)中这样设置:

OTHER_LDFLAGS = -Wl,-no_warn_duplicate_libraries
  1. 版本兼容性问题

直接在 Xcode 构建设置中设置该标志会导致问题:旧版本的 Xcode(如 Xcode 14 及更早)使用的链接器不认识 -no_warn_duplicate_libraries,因此会报错:

ld: unknown option: -no_warn_duplicate_libraries

为了在 Xcode 15 上抑制警告,同时又能兼容旧版本,你可以使用条件化的 Xcode 构建设置,根据 Xcode 版本来决定是否传递这个参数。 4. 解决思路

使用 Xcode 配置文件(.xcconfig)来设置其他链接器标志,并添加条件判断,只在支持的 Xcode 版本中传递 -Wl,-no_warn_duplicate_libraries 参数。 这样既能在新版 Xcode 中抑制重复库警告,又避免了在旧版 Xcode 中出现构建错误。 如果在qt的cmake报错,升级xcode到最新就行;