欢迎光临散文网 会员登陆 & 注册

MinGW + MSVC + CEF 源代码编译 - 3.使用 MSVC 编译 libcef

2022-07-24 01:22 作者:山路旁的辉翎  | 我要投稿

修改完成,开始编译 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...”:

没有将 depot_tools 加入 PATH 环境变量中

建议没有出错也)输入:

  • 提示“FileNotFoundError: [Errno 2] No such file or directory: 'LASTCHANGE'”:

没有执行过 lastchange.py

保证已经完成 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 目录

来了,重头戏。使用 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...”:

SDK 版本混乱

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

setup_toolchain.py

系统安装的 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...”:

XFG 机制

按照提示执行 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--; 注释掉,否则处理属性时会出错):

startup_information_helper.cc
  • 提示“error: enumeration value 'D3D_FEATURE_LEVEL_12_2' not handled in switch”:

SDK 太新了

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 行左右):

device_perf_info_mojom_traits.cc

接着按下图修改(79 行左右):

device_perf_info_mojom_traits.cc

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

device_perf_info.mojom
  • 提示“error: redefinition of '_DXVA_*_AV1'”:

结构体重定义

打开 chromium\src\media\gpu\windows\d3d11_AV1_accelerator.cc,删除两个 #pragma 及之间的所有内容。

d3d11_AV1_accelerator.cc
  • 提示“error: enumeration value 'AudioEffectType_FarFieldBeamForming' not handled in switch”:

SDK 太新了 x2

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

audio_low_latency_input_win.cc

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

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

编译完成

第一条为什么才 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

MinGW + MSVC + CEF 源代码编译 - 3.使用 MSVC 编译 libcef的评论 (共 条)

分享到微博请遵守国家法律