MinGW + MSVC + CEF 源代碼編譯 - 3.使用 MSVC 編譯 libcef
修改完成,開始編譯 libcef [CEF]。這里使用 MSVC,是因為涉及到了 Chromium 的編譯——如此龐大的項目,對編譯器的要求也是相當嚴格的——更不用說引用的庫文件中還有 ATL / MFC?這兩個*小可愛*。
為了節(jié)約篇幅,所有命令只對部分參數(shù)進行介紹,其他參數(shù)可按提供的方法進行查詢。另,多圖警告。

還是下載的步驟,只不過這次是在開發(fā)者命令行中輸入以下內(nèi)容:
GN_DEFINES 可在 https://www.chromium.org/developers/gn-build-configuration/ 查詢,其中 proprietary_codecs=true 和 ffmpeg_branding=Chrome 即為基礎(chǔ)多媒體支持的兩個參數(shù),已經(jīng)可以滿足日常需要了。這里主要參考了 https://blog.csdn.net/whhx2021/article/details/119027875,完善了相關(guān)參數(shù)。
--no-update 和 --no-depot-tools-update 表示不更新 CEF / Chromium / Depot Tools。一方面,這要求之前必須已經(jīng)完成?DEPS 的 gclient sync;但另一方面,這也意味著不需要那啥了,好耶。
各位在查看 GN_DEFINES?的文檔時,可能注意到了 target_cpu 這一參數(shù)。為什么要用 --x64-build 代替呢?這與 automate-git.py 的判斷邏輯有關(guān):只要不使用 --x64-build 等指定系統(tǒng)架構(gòu)的參數(shù),一律按 x86 處理,這甚至會覆蓋 target_cpu 的設(shè)置。

如果一帆風順,那是再好不過??上В@通常是不可能的。下面是一些常見錯誤及其解決辦法。
提示“'git.bat'?is not recognized as an internal or external command...”:

(建議沒有出錯也)輸入:
提示“FileNotFoundError: [Errno 2] No such file or directory: 'LASTCHANGE'”:

在保證已經(jīng)完成?DEPS 的 gclient sync 情況下,輸入(參考 https://magpcss.org/ceforum/viewtopic.php?t=16292):
提示“UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 6: invalid start byte”:

(建議沒有出錯也)輸入:
提示“Exception: No supported Visual Studio can be found...”:

來了,重頭戲。使用 Visual Studio 的 BuildTools(MSVC)進行編譯時,一定會遇到這個錯誤。參考 cef\tools\gclient_hook.py 的注釋,這里需要手動指定編譯所使用的工具鏈:
SDK?路徑與之后圖片不同是重裝的結(jié)果(天知道為什么?Installer?和?MSVC?卸載是綁定的),以上路徑按實際修改即可。如果 %GYP_MSVS_OVERRIDE_PATH%\VC\vcvarsall.bat?和?%GYP_MSVS_OVERRIDE_PATH%\VC\Auxiliary\Build\vcvarsall.bat 均不存在,還要指定?INCLUDE / LIB / PATH 環(huán)境變量,詳見注釋。
提示“AssertionError: user32.lib is not found in LIB...”:

修改?chromium\src\build\toolchain\win\setup_toolchain.py(182 行左右):

系統(tǒng)安裝的 SDK 版本為 10.0.20348.0,對應(yīng)修改即可。
Python 使用縮進區(qū)分不同代碼塊,因此不要直接復制上方代碼(無縮進)!

折騰了幾個小時后一切順利的話,等待十分鐘左右便會出現(xiàn)以下內(nèi)容:

這意味著成功生成工程文件,準備開始編譯了。所以,猜猜我的工程文件生成了幾次?(血壓逐漸升高)
如果之前?gclient runhooks 沒有出錯,那么下面的內(nèi)容可以直接跳過,否則請接著看下去。

開始編譯后,突然提示“CreateProcess failed...”:

或者提示“FileNotFoundError: [WinError 2]...”:

是正常現(xiàn)象,畢竟沒下載完(要下載!懂了嗎)。輸入(參考 https://magpcss.org/ceforum/viewtopic.php?t=17469):
不要在沙箱中運行(如 Sandboxie),否則處理符號鏈接時會出錯。

接下來就是編譯了,其產(chǎn)生的中間文件大約占用?10?GB。如果出錯了也不用擔心,修正后輸入以下命令就能從剛才的地方繼續(xù)編譯:
其中,“-k N”表示 N 個文件編譯失敗后就停止,默認為 1。

(梅開二度)下面是一些常見錯誤及其解決辦法。
提示“To rebaseline...”:

按照提示執(zhí)行 copy 命令即可。問題發(fā)生的原因可能與 XFG(eXtended Flow Guard,拓展控制流防護)有關(guān),相關(guān)鏈接如下:
https://docs.microsoft.com/zh-cn/windows/win32/secbp/control-flow-guard
https://www.anquanke.com/post/id/255236
提示“error: use of undeclared identifier 'PROC_THREAD_ATTRIBUTE_COMPONENT_FILTER'”:

翻遍 UpdateProcThreadAttribute 的文檔也沒找到這個常量,估計是不支持。打開?chromium\src\sandbox\win\src\startup_information_helper.cc,注釋掉 131 行左右的?if 語句塊(不要把 expected_attributes--; 注釋掉,否則處理屬性時會出錯):

提示“error: enumeration value 'D3D_FEATURE_LEVEL_12_2' not handled in switch”:

D3D_FEATURE_LEVEL_12_2 在 10.0.20170.0 的 SDK 中才添加進來,也就是說在 10.0.19041.0 下編譯不會出現(xiàn)此錯誤。先按下圖修改 chromium\src\gpu\ipc\common\device_perf_info_mojom_traits.cc(37 行左右):

接著按下圖修改(79?行左右):

最后按下圖修改?chromium\src\gpu\ipc\common\device_perf_info.mojom(19?行左右):

提示“error: redefinition of '_DXVA_*_AV1'”:

打開 chromium\src\media\gpu\windows\d3d11_AV1_accelerator.cc,刪除兩個 #pragma 及之間的所有內(nèi)容。

提示“error: enumeration value 'AudioEffectType_FarFieldBeamForming' not handled in switch”:

與遠場波束形成有關(guān),估計是新功能。按下圖修改?chromium\src\media\audio\win\audio_low_latency_input_win.cc(195 行左右):

差不多就這些了,其他的隨機應(yīng)變(

看到以下提示,說明編譯完成:

第一條為什么才 27804 呢?是啊,為什么呢(惱)
打開 chromium\src\out\Release_GN_x64\cefclient.exe,開始沖浪測試吧!

其實也沒什么可測的,能播放音視頻就是勝利......

現(xiàn)在,簡簡單單打個包:
以上參數(shù)可使用 python chromium\src\cef\tools\make_distrib.py --help 查詢。此命令最好在編譯完成后直接輸入,在新窗口中輸入時需要重新設(shè)置 set CEF_VCVARS=none。

這樣,下載也完成了,編譯也完成了,我們的旅途(大噓)到這里就全部結(jié)束了。還有一件事,清理一下過程中產(chǎn)生的臨時文件。可能產(chǎn)生臨時文件的文件夾有:
%ProgramData%\Microsoft?Visual?Studio
%AppData%\..\Local
%UserProfile%
%Temp%
還有一件事,該編譯 libcef_dll_wrapper 了——下次再說!
謝謝,寫了很久,已經(jīng)倒下了orz