WebRTC學習之二:編譯(2018年5月更新)

一.準備

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的原始碼結構也發生了巨大的變化。

最新的原始碼網上已經找不到分享了,只能自己科學上網去下載,關於科學上網不建議去某寶購買網路加速器之類的已經fanqiang工具(無法知道這類工具使用的埠號,而cmd中命令列下載WebRTC原始碼時需要指定埠號)。推薦自己搭建科學上網環境(伺服器 客戶端),可以購買搬瓦工VPS,在VPS裡安裝Shadowsocks伺服器,在Windows上使用Shadowsocks客戶端,詳細的搭建過程這類就不說了,畢竟科學上網要低調。

這裡是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目錄中了。

至此,完結。

參考連結:點選開啟連結

參考連結:點選開啟連結