项目需要在arm64平台上跑webrtc,但是提供的工具链是gcc/g++。大家都指定webrtc 默认的编译器是clang++ ,clang++编出来的库,如果第二次开发使用gcc/g++会有很多兼容问题,所以需要将webrtc也用gcc编译。
环境:ubuntu16.4 x86
目标环境:linux arm64
1、下载webrtc:
设置代理:
export http_porxy="http://127.0.0.1:7777"
export https_porxy="http://127.0.0.1:7777"
安装工具depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
echo "export PATH=$PWD/depot_tools:$PATH" > ~/.bashrc
source ~/.bashrc
下载代码:
mkdir webrtc
cd webrtc
fetch --nohooks webrtc
gclient sync
2、按照编译依赖
cd src
./build/install-build-deps.sh
3、下载编译环境:
build/linux/sysroot_scripts/install-sysroot.py --arch=arm64
4、安装编译器:
sudo apt get install binutils-aarch64-linux-gnu
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
5、设置编译参数(下面是原创的)
gn gen out/Release-arm64 --args='target_os="linux" target_cpu="arm64" is_debug=false is_component_build=false is_clang=false rtc_include_tests=false rtc_use_h264=true rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false treat_warnings_as_errors=false use_ozone=true rtc_include_pulse_audio=false use_libjpeg_turbo=false use_system_libjpeg=true'
对我来说上面标红的参数是非常重要的
如果遇到:error: 'isfinite' was not declared in this scope, 可以直接将对应文件的isfinite改为std::isfinite
use_rtti=true,会在编译自己程序连接静态库时报错:undefined reference to `typeinfo for rtc::MessageHandler'
use_custom_libcxx: 这个要这么设置,要不然会使用内置的libcxx,设置了这个就使用libstdcxx了
rtc_include_pulse_audio: 因为我的系统没有pulseaudo ,于是我设置这个直接使用alsa
use_libjpeg_turbo/use_system_libjpeg: 不设置这个会使用内置的libjpeg_turbo,编译会报各种错误
6、遗留问题
这个编出来的libwebrtc.a库没有将json 打包进去,也没有将test_video_capturer 打包进去,导致我第二次开发,独立gcc编译peerconnection_client 的时候报找不到json相关符号表,也找不到undefined reference to `vtable for webrtc::test::TestVideoCapturer 的符号表。 一直没有找到原因,最后手动将相关的点o 打包进libwebrtc.a中,尴尬。 有知道通过编译webrtc 就直接将这些点o 打包进libwebrtc.a 的朋友,欢迎指导。