提问人:Stefan Cosmin 提问时间:11/8/2023 更新时间:11/8/2023 访问量:45
如何在 Linux 平台上将 libwebrtc 与基本的 C++ 程序正确链接?
How to properly link libwebrtc with a basic C++ program, on Linux platforms?
问:
我对 webrtc C++ 原生实现做了一些更改,我使用 ninja 构建系统成功编译了这些实现。然后,我尝试编译此存储库中的代码示例并将其链接到 libwebrtc.a https://github.com/MemeTao/webrtc-native-examples/tree/master/src/video-channel,但它失败并出现未定义的引用错误,如下所示:
/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)
我知道谷歌构建系统使用 C++ 标准的 libc++ 实现而不是 libstdc++ 这一事实可能会带来问题。因此,我使用下面所示的选项生成了构建文件,以便不使用此库。此外,我选择停用测试和调试符号以生成轻量级库,并停用可能导致不兼容的 clang chrome 插件。
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。可以看出,我选择了 clang 编译器,与构建 libwebrtc 的编译器相同,我链接到 libstdc++,我链接到 libwebrtc.a,它与实现文件和 makefile 位于同一个文件夹中,以便在链接时找到它。此外,可以观察到此存储库 https://github.com/MemeTao/webrtc-native-examples/tree/master/src/video-channel 的代码中使用了更多 webrtc 定义的类型,但该问题仅与 CreatePeerConnectionFactory 方法有关。有人解决这个问题吗?
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
答: 暂无答案
评论