Windows下编译调试WebRTC代码
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
在前文《Windows环境下载WebRTC代码》中,我们已经使用 gn
生成了 vs2022 的工程,读者可以直接打开这个 all.sln
,界面如下:
可以看到,有非常多的工程,特别是这个 webrtc 工程,这就是 webrtc 库的工程。但是你在 vs2022 上是无法编译项目的,如果你执行 build
,就会报下面这个错。
1> Task "Exec"
1> 任务参数:Command=call ninja.exe -C E:\windows\src\out\Default\ obj/webrtc.lib
1> call ninja.exe -C E:\windows\src\out\Default\ obj/webrtc.lib
1> 'ninja.exe' 不是内部或外部命令,也不是可运行的程序
1> 或批处理文件。
1> E:\windows\src\out\Default\obj\webrtc.vcxproj(59,5): error MSB3073: The command "call ninja.exe -C E:\windows\src\out\Default\ obj/webrtc.lib" exited with code 1.
这是因为他 gn
生成的 vs2022 工程本身就不是给你编译的,而是方便你能在 vs2022 上面修改代码,如果你想编译,还是要使用 命令行。
我们还是参考《Windows环境下载WebRTC代码》一文,打开一个 vs2022 的命令行终端,然后设置 depot_tools
环境变量。
set path=E:\depot_tools;%path%;
然后我们就可以执行下面的命令来编译 WebRTC 的代码。
cd E:\windows\src
ninja.exe -C out/Default
ninja.exe
编译的时候,是多线程编译的,可以马上看到你的 CPU 是跑满的。
当编译完成之后,就可以看到 obj/webrtc.lib
了,这个是 webrtc 的静态库,有 700 多M大小。
虽然这个静态库很大的,但是通常他不会完全链接进去 exe
文件里面。例如 peerconnection_client.exe
里面就使用了 webrtc.lib
静态库,但是 peerconnection_client.exe
只有 50 M。
静态库就是用到的函数才会链接进去 exe
。
上面这样是完整编译全部项目,如果你只想编译其中一个项目,可以加上 target
,如下:
#只编译 stunserver 项目
ninja.exe -C out/Default stunserver
#只编译 webrtc 静态库
ninja.exe -C out/Default obj/webrtc
下面来介绍一下如何调试 webrtc 的代码。
Google 提供了两个示例来帮我们理解 API 的用法,那就是 peerconnection_client.exe
跟 peerconnection_server.exe
。
peerconnection_server.exe
是一个信令服务器,负责交换 client
的 SDP,这些其实跟之前 libdatachannel 的示例都是比较类似的。
peerconnection_client.exe
是一个客户端程序,负责采集摄像头推送,播放等等。
我们直接点击 peerconnection_client.exe
即可启动这个客户端,如下:
然后我们直接用 vs2022 attach 附加到这个客户端进程上进行调试,如下:
附加到 peerconnection_client.exe
之后,我们在 Conductor::OnServerConnectionFailure
函数设置一个断点,这样我们点击 Connected
按钮的时候连接信令服务器失败就会跑进去这个断点,如下:
提示:如果加载调试符号的过程太慢,请把参考下面这样,把系统函数的符号禁止掉不加载。
TODO:后面讲一下怎么禁用 系统符号。
参考文章:
- 《如何编译WebRTC》- 官方文档