MinGW + MSVC + CEF 源代码编译 - 3.使用 MSVC 编译 libcef
修改完成,开始编译 libcef [CEF]。这里使用 MSVC,是因为涉及到了 Chromium 的编译——如此庞大的项目,对编译器的要求也是相当严格的——更不用说引用的库文件中还有 ATL / MFC 这两个*小可爱*。
为了节约篇幅,所有命令只对部分参数进行介绍,其他参数可按提供的方法进行查询。另,多图警告。

还是下载的步骤,只不过这次是在开发者命令行中输入以下内容:
GN_DEFINES 可在 https://www.chromium.org/developers/gn-build-configuration/ 查询,其中 proprietary_codecs=true 和 ffmpeg_branding=Chrome 即为基础多媒体支持的两个参数,已经可以满足日常需要了。这里主要参考了 https://blog.csdn.net/whhx2021/article/details/119027875,完善了相关参数。
--no-update 和 --no-depot-tools-update 表示不更新 CEF / Chromium / Depot Tools。一方面,这要求之前必须已经完成 DEPS 的 gclient sync;但另一方面,这也意味着不需要那啥了,好耶。
各位在查看 GN_DEFINES 的文档时,可能注意到了 target_cpu 这一参数。为什么要用 --x64-build 代替呢?这与 automate-git.py 的判断逻辑有关:只要不使用 --x64-build 等指定系统架构的参数,一律按 x86 处理,这甚至会覆盖 target_cpu 的设置。

如果一帆风顺,那是再好不过。可惜,这通常是不可能的。下面是一些常见错误及其解决办法。
提示“'git.bat' is not recognized as an internal or external command...”:

(建议没有出错也)输入:
提示“FileNotFoundError: [Errno 2] No such file or directory: 'LASTCHANGE'”:

在保证已经完成 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 路径与之后图片不同是重装的结果(天知道为什么 Installer 和 MSVC 卸载是绑定的),以上路径按实际修改即可。如果 %GYP_MSVS_OVERRIDE_PATH%\VC\vcvarsall.bat 和 %GYP_MSVS_OVERRIDE_PATH%\VC\Auxiliary\Build\vcvarsall.bat 均不存在,还要指定 INCLUDE / LIB / PATH 环境变量,详见注释。
提示“AssertionError: user32.lib is not found in LIB...”:

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

系统安装的 SDK 版本为 10.0.20348.0,对应修改即可。
Python 使用缩进区分不同代码块,因此不要直接复制上方代码(无缩进)!

折腾了几个小时后一切顺利的话,等待十分钟左右便会出现以下内容:

这意味着成功生成工程文件,准备开始编译了。所以,猜猜我的工程文件生成了几次?(血压逐渐升高)
如果之前 gclient runhooks 没有出错,那么下面的内容可以直接跳过,否则请接着看下去。

开始编译后,突然提示“CreateProcess failed...”:

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

是正常现象,毕竟没下载完(要下载!懂了吗)。输入(参考 https://magpcss.org/ceforum/viewtopic.php?t=17469):
不要在沙箱中运行(如 Sandboxie),否则处理符号链接时会出错。

接下来就是编译了,其产生的中间文件大约占用 10 GB。如果出错了也不用担心,修正后输入以下命令就能从刚才的地方继续编译:
其中,“-k N”表示 N 个文件编译失败后就停止,默认为 1。

(梅开二度)下面是一些常见错误及其解决办法。
提示“To rebaseline...”:

按照提示执行 copy 命令即可。问题发生的原因可能与 XFG(eXtended Flow Guard,拓展控制流防护)有关,相关链接如下:
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 下编译不会出现此错误。先按下图修改 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 及之间的所有内容。

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

与远场波束形成有关,估计是新功能。按下图修改 chromium\src\media\audio\win\audio_low_latency_input_win.cc(195 行左右):

差不多就这些了,其他的随机应变(

看到以下提示,说明编译完成:

第一条为什么才 27804 呢?是啊,为什么呢(恼)
打开 chromium\src\out\Release_GN_x64\cefclient.exe,开始冲浪测试吧!

其实也没什么可测的,能播放音视频就是胜利......

现在,简简单单打个包:
以上参数可使用 python chromium\src\cef\tools\make_distrib.py --help 查询。此命令最好在编译完成后直接输入,在新窗口中输入时需要重新设置 set CEF_VCVARS=none。

这样,下载也完成了,编译也完成了,我们的旅途(大嘘)到这里就全部结束了。还有一件事,清理一下过程中产生的临时文件。可能产生临时文件的文件夹有:
%ProgramData%\Microsoft Visual Studio
%AppData%\..\Local
%UserProfile%
%Temp%
还有一件事,该编译 libcef_dll_wrapper 了——下次再说!
谢谢,写了很久,已经倒下了orz

