MinGW + MSVC + CEF 源代碼編譯 - 1.使用 Python 腳本下載
CEF 是基于?Chromium 瀏覽器項(xiàng)目開發(fā)的嵌入式框架,提供了 C / C++ 接口以顯示網(wǎng)頁(yè)。然而,默認(rèn)提供的 CEF 目前并不支持播放音、視頻(如 mp3、mp4 等),因此需要我們手動(dòng)下載源代碼進(jìn)行編譯。

相關(guān)工具的版本號(hào)(未特殊說(shuō)明均為?x64 [x86_64]):
MinGW-w64 GCC:8.1.0(以下簡(jiǎn)稱 MinGW,注意與過(guò)時(shí)的 MinGW?區(qū)分開)
MSVC:14.29.30133(Visual Studio 2019 Version 16.0)
Windows 10 SDK:10.0.20348.0(最低 19041)
Python:3.8.6
CMake:3.21.3
Chromium:99.0.4844.84
除了以上內(nèi)容之外,還需要準(zhǔn)備的有(參考編譯指南):
至少 8 GB 的內(nèi)存,推薦 32?GB+(這個(gè) + 是嘲諷我嘛)
90 GB 的硬盤空間,最好是 SSD(不編譯?Debug 版本會(huì)小一些)
大約 4 h 的 100 Mbps 網(wǎng)絡(luò)連接(可能更久),2.4 GHz 16 邏輯核的 CPU
C++ 桌面開發(fā)包(Microsoft.VisualStudio.Workload.NativeDesktop)
ATL / MFC 支持組件(Microsoft.VisualStudio.Component.VC.ATLMFC)
要從 Google 服務(wù)器下載文件,下略

開始之前想跟大家說(shuō)的話:
這是我第一次寫專欄(貌似也是第一次寫 Blog),語(yǔ)言組織可能有些混亂,還望各位多多包涵!
我呢,在庫(kù)文件編譯——甚至 C++ 方面都是純純的新手(指系統(tǒng)學(xué)習(xí)才一年不到),所以經(jīng)常出現(xiàn)一些幼稚錯(cuò)誤,請(qǐng)務(wù)必溫柔些(
由于我沒有網(wǎng)盤,而且 Chromium?更新速度飛快(短短三個(gè)月版本號(hào)就從 99 跳到了 104),因此我沒必要把編譯的 CEF 放上來(lái),可能過(guò)幾個(gè)月就 Out of date 了。

看到標(biāo)題,可能有些人會(huì)感到迷惑:為什么要同時(shí)安裝 MinGW 和 MSVC 呢?事實(shí)上,一開始只有?MinGW?一個(gè)編譯環(huán)境,因?yàn)?Visual Studio 占用的空間在幾年前的我看來(lái)實(shí)在有點(diǎn)大——當(dāng)然后來(lái)被各種庫(kù)文件狠狠地打臉了......
言歸正傳。最近寫了個(gè)程序練手,某個(gè)功能需要顯示網(wǎng)頁(yè)。如果只是發(fā)送請(qǐng)求或者獲取內(nèi)容,直接用 socket 或者之前簡(jiǎn)單封裝過(guò)的?WinHttp 就好,但渲染網(wǎng)頁(yè)的話......以后再來(lái)探索吧
我第一時(shí)間想到了 CEF,畢竟以?Chromium?為基礎(chǔ)的框架中最容易上手的就是它了。那為什么不用 Qt 的 WebEngine 呢?原因很簡(jiǎn)單:我主程序都直接上的 Win32,已經(jīng)......沒法回頭了。而且,學(xué)習(xí)嘛,走點(diǎn)彎路,不寒磣。
下面,就是如何編譯 CEF 了。如果不需要添加多媒體支持,可以直接使用官方編譯(預(yù)構(gòu)建)的 CEF,這里是下載鏈接:https://cef-builds.spotifycdn.com/index.html
如果要求顯示網(wǎng)頁(yè)中的音視頻呢?那可就有得折騰了。

首先要說(shuō)明的是,官方提供的 CEF 只需編譯?libcef_dll_wrapper,這時(shí)在 MinGW 和 MSVC 中二選一即可。
但是源代碼編譯則需要先用 MSVC 編譯?libcef(純?MinGW?加油,你是最棒的),再用 MinGW / MSVC 編譯?libcef_dll_wrapper,此選擇取決于主程序的編譯方式(不怕麻煩的話請(qǐng)隨意)。

按照開頭準(zhǔn)備就緒,我們先下載源代碼。下載前新建一個(gè)文件夾,這里是 D:\Data\cef_99_0_4844_84(之后均為相對(duì)路徑)。
從以下網(wǎng)址下載 automate-git.py,保存到上述目錄下:
https://bitbucket.org/chromiumembedded/cef/raw/master/tools/automate/automate-git.py
然后,從開始菜單中尋找開發(fā)者命令行,減少環(huán)境變量導(dǎo)致編譯出錯(cuò)的可能:

打開此快捷方式所在位置,右鍵查看屬性,最好手動(dòng)指定?-arch=amd64?-host_arch=amd64 參數(shù)以保證正常編譯(雖然最后發(fā)現(xiàn)聊勝于無(wú)):

打開此快捷方式,輸入以下命令:
成功后將顯示以下內(nèi)容:

以上參數(shù)可使用?python automate-git.py --help 查詢,這里簡(jiǎn)要介紹一下:
--download-dir=. 指定下載目錄為當(dāng)前文件夾
--branch=4844 指定下載分支為 4844(可在?https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding.md#markdown-header-current-release-branches-supported 查詢)
--no-build 不進(jìn)行編譯(要改配置)
--no-distrib 不進(jìn)行打包(閃開,咱自己來(lái))
接下來(lái),只要祈禱下載時(shí)網(wǎng)絡(luò)和那啥都給力些即可??偣残枰螺d的文件數(shù)在七十萬(wàn)左右,占用空間大約?60 GB,預(yù)計(jì)時(shí)間一晚上。這里建議沒有提示錯(cuò)誤時(shí)不要隨便指定 --force-clean,因?yàn)榇藚?shù)會(huì)清除所有下載項(xiàng),而?src 下載失敗通常不影響之前的下載內(nèi)容。那么不得不重新下載時(shí)怎么辦呢?優(yōu)先指定 --force-update(--force-clean 走 git clean -dffx 分支,--force-update 走 gclient revert --nohooks 分支,都很久就是了),希望你用不到這個(gè)參數(shù)。嗚嗚嗚我的 200 GB 流量......
機(jī)械硬盤它做到了!做到個(gè) *,編譯就是純純的折磨!如果實(shí)在沒辦法全放 SSD 里,至少 chromium 文件夾一定要下載到 SSD,可先使用 mklink /d 命令創(chuàng)建符號(hào)鏈接,需要保證目錄結(jié)構(gòu)為?chromium\src。

看到以下提示,說(shuō)明下載完成(大概):

開個(gè)玩笑,其實(shí)我根本沒見過(guò)下載完成長(zhǎng)什么樣......上面是 gclient runhooks 之前的提示。需要注意的是,至少必須完成 DEPS 的 gclient sync(有兩個(gè)“Syncing?projects: 100%,?done.”,其中一個(gè)上方有 DEPS 字樣);如果?gclient runhooks 出錯(cuò),可在編譯前進(jìn)行解決,這里就不占用篇幅了。
看到其他提示(如下圖)時(shí)也不要驚慌,重新輸入命令進(jìn)行下載,大部分都能解決問(wèn)題(實(shí)在不行加個(gè) --force-update):

下載完成后,頂層目錄結(jié)構(gòu)大致如下:

接下來(lái)就是修改配置,添加多媒體支持了。