depot_tools在windows上用遇到的问题和RTC编译出错

为了编译webrtc,执行如下的gn命令生成out/WinDefault_debug没问题

gn gen out/WinDefault_debug --ide=vs2019 --args="target_cpu=\"x86\" rtc_include_tests=true target_os=\"win\" is_component_build=false is_clang=false use_lld=false treat_warnings_as_errors=false use_rtti=true rtc_build_examples=true enable_iterator_debugging=true"

(生成VS2019的工程;生成x86的可执行文件;rtc_include_tests表示生成测试用例;target_os表示生成平台是windows;is_component_build是false表示是静态库,true的话是动态库;不使用is_clang编译;不使用lld机制;不将警告视作错误;使用C++的运行时类型识别RTTI;生成示例)

我把文件生成到WinDefault_debug目录下,与linux上的编译做区分而已。


2022年4月24日补充

1、webrtc.lib编译出来是静态库,而且是静态链接C/C++运行库的。但是多数exe都是使用动态链接C/C++运行库的。所以找到src/build/config/win/BUILD.gn,找到里面的

#Desktop Windows: static CRT
configs = [":static_crt"]

改为

configs = [":dynamic_crt"]

2、最新的代码用VS2019去编,用VS2019去编,用VS2019去编!!!

3、编译出来的webrtc.lib在用的时候,出现链接错误

error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”

在gn命令的--args里增加enable_iterator_debugging=true

4、is_component_build选项对webrtc无法设置为true,也就是webrtc无法编译成dll。如果设置了true执行gn就会报错。本来is_component_build同时还控制链接动态还是静态的crt,不能设置成true就只能按1的方法手改了


但是运行ninja构建的时候遇到了两个问题:

我已经设置了环境变量:

set vs2017_install=F:\Microsoft Visual Studio\2017\Enterprise
set GYP_MSVS_OVERRIDE_PATH=F:\Microsoft Visual Studio\2017\Enterprise
set GYP_GENERATORS=msvs-ninja,ninja
set WINDOWSSDKDIR=F:\Windows Kits\10
set GYP_MSVS_VERSION = 2017
set DEPOT_TOOLS_WIN_TOOLCHAIN=0

这里特别注意我的Visual Studio不是装在默认的C盘!!!

问题1)提示缺少头文件,链接找不到mt.exe和rc.exe

例如:

        fatal error C1083: 无法打开包括文件: “winapifamily.h”: No such file or directory

        fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory

有文章说ninja -t msvc -e environment.x86提供的环境变量INCLUDE缺少了一些路径,environment.x86是一个文件。可是我怎么也找不到environment.x86(我确实是编译32位的库,在gn的--args里加了target_cpu="x86"选项)这个文件

原来是我的VS安装路径不同,正常情况下执行ninja会生成environment.x86文件的。要解决这个问题,在webrtc的源码目录找到这个文件:src/build/vs_toolchain.py,里面识别VS的安装路径是写死的C盘,所以修改一下

灰色的部分原本是没有的,加进去。注意逗号、字符串单引号(会python的话改这个就是小意思,不会的话就按照我这里注意事项改就行了)。路径写自己的VS安装的真实路径,我是企业版,目录最后一级是Enterprise,如果是社区版或者预览版参照前面的几行代码写到Community、Preview目录一级。然后保存重新运行ninja -C。

如果上面的路径写对了,这时候在out/WinDefault_debug(多数人都是out/Default目录,反正你自己执行gn的时候写的输出目录是什么就是什么)就会有environment.x86生成。

记事本打开environment.x86文件,找到INCLUDE=这一段,把缺少的头文件路径加上去即可。

问题2)ninja: build stopped: subcommand failed.

 看上去没有任何信息,就直接说失败。其实不是的,因为ninja默认并发编译,所以错误详细信息前面输出了,然后被另一个进程的输出刷过去了,再显示的失败。运行ninja的时候加上-j 1,变成单进程运行,就能看到错误消息是什么了,处理完了之后再把-j 1去掉。


2022年4月24日补充

问题3) -Wno-shadow选项报无法识别的数值参数

搜索所有build.gn,然后在里面寻找-Wno-shadow,加上if(!is_win)限制,让windows平台不加这个选项就好了。不是每个build.gn都有的,也就10个左右,都改一下就行。

这是我修改的其中一个,加上if判断不是Windows才加,Windows就不加就能避免了。注意看看前后有没有一样的层级的if,他们的缩进是用空格还是tab、用多少个,就跟着照样。我没有学习过gn脚本的语法,但是不排除跟makefile一样缩进对脚本也是有语法意义的,所以最好跟着前后的缩进等级和缩进方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值