为了编译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一样缩进对脚本也是有语法意义的,所以最好跟着前后的缩进等级和缩进方法。