一.准備
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目錄中了。
至此,完結。
---------------------
作者:燦哥哥
來源:CSDN
原文:https://blog.csdn.net/caoshangpa/article/details/53353681
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!