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

Linux平台下C++程序链接libwebrtc遇未定义引用问题求助

WebRTC链接时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 to webrtc::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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:47:25