当前位置 博文首页 > 草上爬的博客:WebRTC学习之二:编译(2021年3月更新)

    草上爬的博客:WebRTC学习之二:编译(2021年3月更新)

    作者:[db:作者] 时间:2021-08-05 22:10

    一.准备

    1.操作系统

    Win7 64位及以上,必须是64位的。我用的Win10,64位。

    2.VS版本

    Visual Studio 2015 Update 3及以上。我用的Visual Studio 2015 Update 3。

    http://download.microsoft.com/download/7/c/f/7cf151c3-b735-4e35-a1bb-9a48224f4a95/vs2015.3.ent_chs.iso

    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 的解决方案

    以上环境是2016年3月11号以后的WebRTC版本必须的。

    二.下载

    WebRTC下载方法略,这里分享一个2016年6月22号的版本,只含源码,比较小。

    http://pan.baidu.com/s/1bpHvsZX

    我分享的这个版本已经带all.sln了,并且移除了test、unittest和demo工程。打开all.sln直接编译就行。

    如果只是需要WebRTC静态库,看到这里就可以了。

    三.编译

    毕竟test、unittest和demo工程是学习WebRTC最好的资料,如果想编译它们,得自己重新生成all.sln。

    1.VS工程文件生成

    将源码解压,我解压到了D:\webrtc20160622

    输入上图指令就能在源码目录中生成all.sln,包含所有的工程。

    注意:

    a)要用 set GYP_GENERATORS=msvs, 不要用set GYP_GENERATORS=ninja,msvs-ninja,否则会报大量的编译错误。

    b)除了我分享的版本,网上下载的各种未生成工程文件的源码也可以这个方法进行工程文件生成。

    c)在编译test、unittest和demo工程时,会遇到一些问题,如下所示。

    2.一些错误处理

    问题1:error C2220: 警告被视为错误 - 没有生成“object”文件

    原因:该文件的代码页为英文,而我们系统中的代码页为中文。

    解决方法:

    双击该错误打开对应文件,选择“文件”菜单中的“高级保存选项”菜单项,如下图所示。

    然后将编码方式选择为中文,如下图所示。

    问题2:LINK : fatal error LNK1104: 无法打开文件“D:\webrtc_test\build\Debug\lib\gtest_prod.lib”

    原因:gtest_prod这个工程没有导出类,所以其就不生成lib。

    解决方法:

    右键该工程,添加一个类,类名随便取,比如说Test123,然后将该类头文件改成如下所示。

    Test123.h

    #pragma once
    extern "C" __declspec(dllexport) class Test123
    {
    public:
    	Test123();
    	~Test123();
    };
    
    

    Test123.cpp

    #include "Test123.h"
    
    Test123::Test123()
    {
    }
    
    Test123::~Test123()
    {
    }

    需要注意的是,需要将项目类型选择为静态库,如下图所示。

    如果其他项目还提示缺少gtest_prod.lib,将其拷贝到指定位置。

    问题3:LINK : fatal error LNK1181: 无法打开输入文件“D:\webrtc_test\build\Release\lib\system_wrappers_default.lib”

    原因:同问题2

    解决方法:同问题2,这里类名为Test456

    问题4:error MSB3721: 命令“call python "..\..\tools\isolate_driver.py" "check" "--isolated" "..\..\build\Release\peerconnection_unittests.isolated" "--isolate" "peerconnection_unittests.isolate" "--path-variable" "DEPTH" "..\.." "--path-variable" "PRODUCT_DIR" "..\..\build\Release\ " "--config-variable" "CONFIGURATION_NAME=Release" "--config-variable" "OS=win" "--config-variable" "asan=0" "--config-variable" "branding=Chromium" "--config-variable" "chromeos=0" "--config-variable" "component=static_library" "--config-variable" "disable_nacl=0" "--config-variable" "enable_pepper_cdms=1" "--config-variable" "enable_plugins=1" "--config-variable" "fastbuild=0" "--config-variable" "icu_use_data_file_flag=1" "--config-variable" "internal_gles2_conform_tests=0" "--config-variable" "kasko=0" "--config-variable" "lsan=0" "--config-variable" "msan=0" "--config-variable" "target_arch=ia32" "--config-variable" "tsan=0" "--config-variable" "use_custom_libcxx=0" "--config-variable" "use_instrumented_libraries=0" "--config-variable" "use_prebuilt_instrumented_libraries=0" "--config-variable" "use_ozone=0" "--config-variable" "use_x11=0" "--config-variable" "v8_use_external_startup_data=1" "--config-variable" "msvs_version=2015"”已退出,返回代码为 1。

    原因:未知

    解决方法:双击该错误,定位到所在文件的所在行,将该行删除。如下图所示,删除光标所在的行。

    参考链接:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26000296&id=5746543

    参考链接:https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md

    ==========================2018年5月更新=======================

    今天又开始捣鼓WebRTC了,与上次相比,过了一年,WebRTC的源码结构也发生了巨大的变化。

    最新的源码网上已经找不到分享了,只能自己去下载。

    这里是WebRTC官网的源码获取和编译指南,安装指南中的步骤,在理想的状态下可以成功。下面是我的实操过程。

    一.准备

    1.操作系统

    Win7 64位及以上,必须是64位的。我用的依然是Win10,64位。

    2.VS版本

    Visual Studio 2017 及以上。我用的Visual Studio 2017 15.6企业版。

    下载链接:https://download.csdn.net/download/caoshangpa/10410923

    安装VS2017时,要选择桌面C++开发功能以及MFC and ATL support。另外,WIN10 SDK必须安装10.0.15063版本,其余版本可能导致编译失败。下面是我安装时选择的组件。

    WIN10 SDK还需要安装Debugging Tools,安装步骤为 控制面板 → 程序 → 程序和功能 → 选中“Windows Software Development Kit” → 变更 → Change → Check “Debugging Tools For Windows” → Change。

    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 的解决方案

    5.depot_tools

    depot_tools是包含下载、编译的相关工具,需要先下载并配置它,才能继续后面的操作。

    下载地址:https://storage.googleapis.com/chrome-infra/depot_tools.zip

    下载后解压,并将解压好的depot_tools目录添加到path系统环境变量中,如下图所示:

    二.源码的获取和编译

    1.设置系统环境变量

    当然也可在cmd窗口的设置,效果和上图一样,但是后续的所有命令行操作都必须在该cmd窗口中进行,如果该窗口关闭,需要重新设置 ,而上图的设置可以一劳永逸。下面是在cmd窗口中设置的指令:

    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\Enterprise #vs安装路径,替换成自己的
    set GYP_GENERATORS=msvs-ninja,ninja #使用ninja编译
    set http_proxy=127.0.0.1:1080 
    set https_proxy=127.0.0.1:1080

    这里要注意的是http_proxy和https_proxy的设置,也就是代理的设置。127.0.0.1:1080表示使用本机代理的1080端口,这个端口号是在Shadowsocks客户端中设置的,如下图所示:

    2.使用depot_tools获取WebRTC源码

    在cmd窗口中输入以下命令,这一步直接参考指南:

    mkdir webrtc-checkout #这是创建一个目录,当然也可以用鼠标创建。
    cd webrtc-checkout #进入到我们刚刚创建的目录中
    fetch --nohooks webrtc #获取代码,这一步会花点时间,一般会失败,反正我试了几次都失败了
    gclient sync # 当过程中断时(包括上一步的失败),我们可以使用该命令恢复并继续

    源码比较大,确保购买的VPS至少有20G流量(后面会说明原因);代码编译后有23G左右,注意预留磁盘空间。Shadowsock客户端的系统代理模式选择PAC模式或者全局模式都是可以的,亲测。两种模式的区别是PAC模式只有访问外围资源的时候才走代理,全局模式是访问任何资源都会走代理。

    这一步在理想状态下可以成功,WebRTC的官网肯定不会忽悠人,但是在国内,至少我没成功。遇到的几个坑这里说一下。

    ☆尽量用网线。因为我是用的笔记本,当然用WiFi比较方便,但是有时候WiFi不太稳定,会出现下载中断的情况。比如提示错误:fatal:early EOFS......;fatal:The remote end hung up unexpectedly。意思是下载过早结束;远端(代理服务器)意外挂起(访问不到了)。这一点用WiFi的同学要注意。

    解决方法:将路由断电,过几秒再上电(坑了哥几个小时)。如果依然提示上述错误,可能是服务器真的挂了。

    ? ? ? ? ? ? ? ? ? 后来我用网线又下载了一份源码,没出现上面的问题,所以建议用网线。

    执行gclient sync的过程中会有些警告,但是没有什么影响,不必在意,比如:

    点击Shadowsocks的托盘图标(小飞机),打开UI界面。此时在任务管理的“应用”分类中可以看到Shadowsocks的进程信息,如果一直在下载,进程信息的网络字段不会为0,我的是2Mbps左右。

    这一点很关键,如果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分支已经到55了,然后切换到目标分支并打上标签。

    git checkout -b my_branch refs/remotes/branch-heads/55
    gclient sync

    这一步也是耗时巨长,赶上下载用时了,等得你怀疑人生,问题是我执行完这一步后,后面的编译步骤居然失败了,原因没有去深究,因为我主要是想学习WebRTC的一些技术,直接用master分支就行。

    所以如果只想学习的话,建议不要切分支。

    如果遇到如下提示:NOTICE:You have PROXY values set in your environment,......BOTO_CONFIG......NO_AUTH_BOTO_CONFIG environment var.

    解决方法:新建一个文件,http_proxy.boto,放在任意位置,我放到了D:\depot_tools中,文件内容如下:

    [Boto]
    proxy=127.0.0.1
    proxy_port = 1080

    然后将该文件添加到系统环境变量,如下图:

    3.编译

    指令如下:

    cd webrtc-checkout\src
    gn gen out/Default --ide=vs2017 #生成VS2017解决方案
    ninja -C out/Default #开始编译

    这一步也有个大坑,VS2017最好是安装在默认目录C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise,或者只改个盘符,否则即使设置了GYP_MSYS_VERSION环境变量,还是会提示错误:Exception:Visual Studio Version 2017(from GYP_MSYS_VERSION)not found

    产生这个错误的原因是webrtc-checkout\src\build\vs_toolchain.py中语句已经把部分VS的安装路径写死了,如下所示:

    for path in (
            os.environ.get('vs2017_install'),
            os.path.expandvars('%ProgramFiles(x86)%'
                               '/Microsoft Visual Studio/2017/Enterprise'),
            os.path.expandvars('%ProgramFiles(x86)%'
                               '/Microsoft Visual Studio/2017/Professional'),
            os.path.expandvars('%ProgramFiles(x86)%'
                               '/Microsoft Visual Studio/2017/Community')):
          if path and os.path.exists(path):
            return path

    gn工具有一些参数可以设置,例如:

    //下面一条指令生成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

    4.测试

    成功编译后,在webrtc-checkout\src\out\Default中会有一些可执行的小例子,比如peerconnection_server.exe和peerconnection_client.exe,可以用它俩进行简单的测试。

    比较恶心的一点是编译生成的静态库都散落在webrtc-checkout\src\out\Default\obj里的各个目录中,可以在webrtc-checkout\src\out里新建一个bat脚本CopyLibsToReports.bat,内容是:

    @echo off  
    set /p filename=请输入要查找并拷贝的文件扩展名:  
    echo.   
    echo 文件搜索拷贝中,请耐心等待...  
    set reports="%cd%/reports"  
      
    if exist reports (  
        rd /s /q reports  
        md reports  
    ) else (  
        md reports  
    )  
    for /f "delims=" %%i in ('dir /b /a-d /s "*.%filename%"') do (  
    echo %%i  
    xcopy %%i reports /-y  
    )  
    echo 文件搜索拷贝完成!!!!!!  
    pause  

    双击该脚本,所有的lib文件都拷贝到checkout\src\out\reports目录中了。

    至此,完结。

    参考链接:点击打开链接

    参考链接:点击打开链接

    ==========================2021年3月更新=======================

    一.准备

    这部分参考2018年5月的更新,说来惭愧,好几年没换电脑了。

    唯一不同的是:由于最新WebRTC源码要求10.0.18362及以上Win10 SDK。所以请下载10.0.18362 或以上的Win10 SDK。由于10.0.18362 Win10 SDK存在于VS2019安装选项中,VS2017安装选项不带有该SDK,所以使用VS2017得从Win10 SDK下载另外下载最新Win10 SDK,或者再装个VS2019选择安装该SDK

    二.源码的获取和编译

    1.设置系统环境变量

    当然也可在cmd窗口的设置,效果和上图一样,但是后续的所有命令行操作都必须在该cmd窗口中进行,如果该窗口关闭,需要重新设置 ,而上图的设置可以一劳永逸。下面是在cmd窗口中设置的指令:

    set vs2017_install=D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise
    set GYP_MSVS_OVERRIDE_PATH=D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise
    set GYP_GENERATORS=msvs-ninja,ninja
    # 告诉depot_tools使用我们本机的VS进行编译
    set DEPOT_TOOLS_WIN_TOOLCHAIN=0
    set http_proxy=127.0.0.1:7890
    set https_proxy=127.0.0.1:7890

    这里要注意的是http_proxy和https_proxy的设置,也就是代理的设置,这一次没用Shadowsocks,用的是Clash,Clash的默认端口就是7890,如下图所示:

    2.使用depot_tools获取WebRTC源码

    在cmd窗口中输入以下命令,这一步直接参考指南:

    mkdir webrtc-checkout #这是创建一个目录,当然也可以用鼠标创建。
    cd webrtc-checkout #进入到我们刚刚创建的目录中
    fetch --nohooks webrtc #获取代码,这一步会花点时间
    gclient sync # 当过程中断时,我们可以使用该命令恢复并继续

    源码依然很大,注意预留磁盘空间和充足的流量。最新的源码获取没报任何错误,我把VS2017安装到D盘也可以自动识别,应该是相关脚本被优化了。

    3.编译

    指令如下:

    cd webrtc-checkout\src
    gn gen out/Default --ide=vs2017 #生成VS2017解决方案
    ninja -C out/Default #开始编译

    编译也没报任何错误,惊呆了。

    用VS2017打开:

    4.代码更新

    git checkout master
    git pull origin master
    gclient sync

    5.引用WebRTC库

    WebRTC编译后会在src\out\Default\obj目录下生成整个WebRTC工程的静态库:webrtc.lib,链接下这个就可以了。

    参考链接:https://blog.jianchihu.net/webrtc-build-vs2017.html

    原创不易,转载请标明出处:https://blog.csdn.net/caoshangpa/article/details/53353681

    cs