编译过多次,或多或少都会遇到相同问题,好记忆不如烂笔头,今天动手。。。
文章结构部分照抄别人的,根据自已的步骤稍做修改。
一准备工作
1.系统版本
WIN10,64位
2.VS版本
Visual Studio 2017最新版本
3.Python
编译过程中需要,我用的2.7.9版本,需添加到Path环境变量。
https://www.python.org/ftp/python/2.7.9/python-2.7.9.amd64.msi
4.Microsoft DirectX SDK (June 2010)
如果安装出错,参考:安装DirectX SDK时出现Error Code:s1023 的解决方案
二.下载
参照官方文档 https://webrtc.org/native-code/development/
前期准备工作,少不了代理,配置环境变量
set DEPOT_TOOLS_UPDATE=0 #不更新depot_tools
set DEPOT_TOOLS_WIN_TOOLCHAIN=0 #编译时使用本机VS工具链
set GYP_MSVS_VERSION=2017 #指定VS版本
set GYP_MSVS_OVERRIDE_PATH=“C:\Program Files (x86)\Microsoft Visual Studio\2017\Community #vs安装路径,替换成自己的
set GYP_GENERATORS=msvs-ninja,ninja #使用ninja编译
set http_proxy=127.0.0.1:1080
set https_proxy=127.0.0.1:1080
1.先安装depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
下载完后
cd depot_tools
下载好了之后,需要先执行一次gclient
命令,用于初始化工具集,这一步十分重要,如果执行不成功, 工具集将是不完整的,会导致后续步骤的失败
./gclient
2.下载webrtc
根据官方文档
mkdir webrtc-checkout
cd webrtc-checkout
fetch --nohooks webrtc
gclient sync
如果代理配置有问题,这其中会有报错
☆这一点很关键,如果gclient sync执行成功,下载的WebRTC的源码大概6G左右,但是此时的源码并不完整,还缺少一些工具和资源文件。比如会缺少下列工具和资源文件:
工具
gn.exe:位于webrtc-checkout\src\win,这就是为什么在生成VS解决方案工程的时候提示找不到gn.exe
clang-format.exe:位于webrtc-checkout\src\buildtools\win
isolate.exe:位于webrtc-checkout\src\tools\luci-go\win64
......
资源
位于webrtc-checkout\src\resources
......
这里工具比资源重要,有同学可能想到了去其他地方拷贝,但这是下策,因为上面列举工具和资源是我所知缺少的,至于是否还缺少其他的,我并不知道。
解决方法:执行gclient runhooks(执行一次HOOK操作),或者执行gclient sync --force(此命令会自动
执行一次HOOK操作)。此时会下载缺失的工具和资源文件。下载完成后,源码大小为11G左
右,这就是为什么要确保购买的VPS至少有20G流量
☆代码下载完成后在master分支上,如何切换到release分支,指南中有提到,指令如下:
cd webrtc-checkout\src
git branch -r #查看release分支
最新的release分支已经到m74了,然后切换到目标分支并打上标签。
git checkout -b my_branch refs/remotes/branch-heads/m74
gclient sync
☆如果遇到如下提示:NOTICE:You have PROXY values set in your environment,......BOTO_CONFIG......NO_AUTH_BOTO_CONFIG environment var.
解决方法:新建一个文件,http_proxy.boto,放在任意位置,我放到了D:\git\depot_tools中,文件内容如下:
[Boto]
proxy=127.0.0.1
proxy_port = 1080
系统环境变量配置:NO_AUTH_BOTO_CONFIG=D:\git\depot_tools\http_proxy.boto
3.编译webrtc
我个人是喜欢用vs工 程编译,so...
ps:默认编译出来是MT or MTD,如果需要编译MD or MDD,起飞=> 修改RuntimeLibrary类型
//下面一条指令生成VS2017的win32 debug工程
gn gen out/Debug --ide=vs2017 --args="is_debug=true target_cpu=\"x86\""
//下面一条指令生成VS2015的win32 release工程
gn gen out/Release --ide=vs2017 --args="is_debug=false target_cpu=\"x86\""
//以上方法均建议使用ninja方法编译,速度快
ninja -C out/Debug
//或者
ninja -C out/Release
为了让自己编译出来的webrtc库能够被自己的vs工程使用关键是gn生成工程文件的地方。
webrtc默认的编译器是clang. 通过她编译出来的lib有时候我们的vs工程用不了会报如下错误:
webrtc.lib : fatal error LNK1136: invalid or corrupt file(只是举个例子)
所以在使用gn生成工程文件的时候需要带上 “is_clang=false ” 这样的参数。例如:
gn gen out/Debug --ide=vs2017 --args="is_debug=true target_cpu=\"x86\" is_clang=false"
去掉单元测试的命令
gn gen --ide=vs out/Debug --args="target_winuwp_version=\"8.1\" target_winuwp_family=\"desktop\" use_rtti=true is_clang=false libyuv_include_tests=false rtc_include_tests=false libyuv_include_tests=true rtc_use_h264=true"
4.编译后库文件太散,自动整理脚本
附上一个linux拷贝脚本:
注: 脚本应当在WebRTC的webrtc目录的上一级目录运行 这样才能对应头文件中的相对路径关系.
Linux cp命令加上parents参数时,可以保持目录结构
脚本放在src同级目录,会在当前目录生成 inc和lib两个文件夹
#!/bin/bash
echo $src
echo do temInc
src=`find src/ -name "*.h"`
mkdir temInc
for obj in $src
do
#echo "cp header file $obj"
cp --parents $obj temInc/
done
mv ./temInc/src ./inc
rm -rf temInc
echo do lib
mkdir lib
echo do lib Debug
cd lib
mkdir Debug
cd ..
src=`find src/out/Debug/ -name "*.lib"`
for obj in $src
do
#echo "cp header file $obj"
cp $obj lib/Debug/
done
echo do lib Release
cd lib
mkdir Release
cd ..
src=`find src/out/Release/ -name "*.lib*"`
for obj in $src
do
#echo "cp header file $obj"
cp $obj lib/Release/
done
一个简单的脚本即可以提取出头文件,这个方法同样适用于提取任意工程的指定类型文件.
5.windows合并N个lib文件为libwebrtc.lib一个文件
打开vs developer command 控制台
cd lib/Debug
lib.exe /OUT:libwebrtc.lib *.lib
cd ..
cd lib/Release
lib.exe /OUT:libwebrtc.lib *.lib
6.为项目设置相关的宏
应用webrtc库需要的宏一般只有三个:NOMINMAX WIN32_LEAN_AND_MEAN WEBRTC_WIN