Linux平台下C++程序链接libwebrtc遇未定义引用问题求助
CreatePeerConnectionFactory未定义引用问题解决思路 问题场景
修改WebRTC C++原生实现并通过Ninja编译后,将WebRTC原生示例代码与libwebrtc.a链接时,出现如下未定义引用错误:
/home/stefan/webrtc-samples/src/video-channel/Obj/main.o: In function
main': /home/stefan/webrtc-samples/src/video-channel/main.cpp:221: undefined reference towebrtc::CreatePeerConnectionFactory(rtc::Thread*, rtc::Thread*, rtc::Thread*, rtc::scoped_refptr<webrtc::AudioDeviceModule>, rtc::scoped_refptr<webrtc::AudioEncoderFactory>, rtc::scoped_refptr<webrtc::AudioDecoderFactory>, std::unique_ptr<webrtc::VideoEncoderFactory, std::default_delete<webrtc::VideoEncoderFactory> >, std::unique_ptr<webrtc::VideoDecoderFactory, std::default_delete<webrtc::VideoDecoderFactory> >, rtc::scoped_refptr<webrtc::AudioMixer>, rtc::scoped_refptr<webrtc::AudioProcessing>)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
编译libwebrtc.a时使用的GN参数:
gn gen out --args="is_debug=false rtc_include_tests=false is_component_build=false use_rtti=true use_custom_libcxx=false rtc_enable_protobuf=false clang_use_chrome_plugins=false"
构建示例代码的Makefile:
CC = clang++ CFLAGS = -Wall -g -DWEBRTC_POSIX -std=c++17 -stdlib=libstdc++ SRC_DIR = $(PWD) SRC_FILES = $(wildcard $(SRC_DIR)/*.cpp) $(wildcard $(SRC_DIR)/*/*.cpp) OBJ_DIR = $(PWD)/Obj OBJ_FILES = $(patsubst $(SRC_DIR)/%.cpp, $(OBJ_DIR)/%.o, $(SRC_FILES)) ADDITIONAL_OBJ_FILES = $(PWD)/Deps/*.o WEBRTC_OBJ_PATH = ~/webrtc-l4s/webrtc_native/m104/src/out/Default2/obj INCLUDES_PATH = -I../../third_party/webrtc/ -I../../third_party/webrtc/third_party/abseil-cpp/ -I../../third_party/webrtc/buildtools/third_party LIBRARIES_PATH = -L../../third_party/webrtc/buildtools/third_party #use portable -pthread instead of classic -lpthread LIBS = -pthread -ldl -L. -lwebrtc BIN_DIR = $(PWD)/Bin TARGET_BINARY = $(BIN_DIR)/demoWebrtc.bin all: $(TARGET_BINARY) @echo "[Build log] Target binary successfully built!" $(TARGET_BINARY): $(OBJ_FILES) @echo "[Build log] Linking..." @echo $(ADDITIONAL_OBJ_FILES) $(CC) $(LIBRARIES_PATH) -o $@ $^ $(LIBS) @echo "[Build log] Program linked!" $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp @echo "[Build log] Compiling..." $(CC) $(CFLAGS) $(INCLUDES_PATH) -c $< -o $@ @echo "[Build log] File" $< "compiled!" clean: rm -rf $(OBJ_DIR)/*.o rm -rf $(BIN_DIR)/*.bin
解决方向
1. 验证目标符号是否存在于libwebrtc.a中
用nm工具检查静态库是否包含该函数符号:
nm -D libwebrtc.a | grep CreatePeerConnectionFactory
如果未找到对应符号,说明编译WebRTC时未包含该函数实现,需检查GN参数是否禁用了相关模块。例如:
- 是否开启
rtc_enable_video(默认开启,关闭会导致视频相关工厂函数缺失) - 是否有其他参数(如
rtc_include_video_codecs)导致函数被编译剔除
2. 确认函数签名完全匹配
WebRTC的CreatePeerConnectionFactory有多个重载版本,需确保代码调用的签名与库中提供的完全一致:
- 检查
std::unique_ptr模板参数、scoped_refptr类型是否与WebRTC头文件定义一致 - 确认编译宏定义匹配:Makefile中已定义
WEBRTC_POSIX,需确保编译WebRTC时也使用了相同平台宏
3. 调整链接顺序与依赖库
C++链接器对库顺序敏感,依赖库需放在使用它的目标文件之后(当前Makefile顺序正确),但需补充WebRTC依赖的其他库:
LIBS = -pthread -ldl -L. -lwebrtc -labsl_base -labsl_memory -labsl_strings
具体依赖的abseil库可通过readelf -d libwebrtc.a | grep NEEDED查看。
4. 确保标准库ABI兼容性
虽然已设置use_custom_libcxx=false使用libstdc编译WebRTC,仍需确认示例代码与WebRTC使用的libstdc版本一致:
# 检查WebRTC依赖的标准库版本 readelf -d libwebrtc.a | grep libstdc++ # 检查clang默认链接的标准库版本 clang++ -stdlib=libstdc++ -v
若版本不一致,需指定clang使用与WebRTC相同的libstdc++路径。
5. 匹配WebRTC版本
示例代码需与编译的WebRTC版本(m104)匹配:
- 查看WebRTC m104版本头文件中
CreatePeerConnectionFactory的定义 - 对比示例代码中的调用参数、返回值是否与该版本一致
内容的提问来源于stack exchange,提问作者Stefan Cosmin

