背景
探索浏览器参数开发时,发现第一步 Chromium 源码编译这块就坑点很多,这里统一记录下,以便未来碰到类似的 Visual Studio 编译时,会遇到同样的问题。
据说Electron源码编译大致相同,如果想从源码角度来修改Electron中的Chromium的话,掌握Chromium源码编译也是有点用的,Chromium中有些参数的微调以及收发数据的调整等。
遇到问题的关键点,主要还是对于 VS IDE 的不熟练,以及对 C++相关知识的欠缺导致。
基于 B 站 Up 主的这个 Chromium 源码编译视频合集进行整理
浏览器内核开发 - 编译流程(3)_哔哩哔哩_bilibili
Visual Studio 的注意事项(expected Clang 17.0.0)
-
B 站视频 给了 VS2022 版本,但是录制时间是 2023 年,这期间 VS2022 可能又改动了什么(更新了MSVC 因为 UP 主早期将版本固定起来,所以没有受到影响),导致编译过程极其不顺畅,所以选择使用 VS2019,可以避免 clang 版本编译时,需要 17 或者更高版本的提示
-
一般人直接下载 VS2022 版本下来,基本上都会碰到这个问题
-
static assertion failed: error STL1000: Unexpected compiler version, expected Clang 17.0.0 or newer
-
看 CSDN 上面的MSVC设置版本_如何修改msvc版本-CSDN博客,MSVC 是可以更改的,理论上说也必须可以更改,否则还让下载下来干嘛,下面是 CSDN 的更改教程,深入了解后,发现这里更改可能并不影响 Chromuim 中的 MSVC 的取用,在 chrome.vcxproj (everything 搜索,因为文件特别多,要反复让 everything 重建索引,否则搜不到)有一段配置,这里指定了 MSVC 的版本号
<PropertyGroup Label="Locals">
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
-
另外通过图形界面项目(不是文件夹)右键——属性——配置属性——常用,这里也可以选择,但是是否影响项目的配置文件
你改这里不会影响 chrome.vcxproj 文件,应该是没有用的,这里应该是 VS 自己创建项目时有用吗?
说说 MSVC 是什么?
-
MSVC 就是微软 VC++编译器的简写,微软通过这个编译器编译 C++代码
-
Clang 也是一个 C++编译器,只不过是一个建立 在 Windows,Mac,Linux 编译器之上的第一个调度器,类似于你 jquery 的概念,只要你按照 Clang 的编译器要求编写代码,那么在将代码移植到其他操作系统上时,Clang 就会调用具体操作系统的 C++引擎来进行编译,也即 Clang 还是会调用 MSVC 的代码来进行 CXX 代码的编译
-
所以当 MSVC 版本较高时,Clang 版本较低时,Clang 执行 MSVC 代码时就会提示上述expected Clang 17.0.0 or newer, 此时就要降级 MSVC
更改 Windows Kits (SDK) / VS2022 安装路径
vs2022 如果你不是选择默认安装路径,那么你改一下,gn gen 这里就会报 WINDOWSSDKDIR 找不到的问题,所以一上来习惯更改 VS2022 的人必须遇到这个坑,且很二逼的是,你想再装默认路径,好像就没机会了,必须通过删除注册表来修改(这个够呛)
gn gen --ide=vs2019 --winsdk="10.0.19041.0" out/chromium_debug_x86 --args="is_debug = true is_component_build = true enable_nacl = false target_cpu = \"x86\" proprietary_codecs = true ffmpeg_branding = \"Chrome\""
CSDN 删除注册表:解决安装Visual Studio 2022中共享工具、组件和SDK的路径无法修改的问题_vs共享组件工具sdk路径不可改-CSDN博客
如果你比较倔强,那也可以,那就在环境变量中自己配置,之后所有的 WINDOWSSDK 都会下载到这个目录里
你可以从官方链接下载具体的 SDK,安装时一旦你更改了安装目录(这里还会自动检测 C 盘空间不够时,直接给你找个最大的目录,后绪你还改不了了,也得注册表改)
运行 regedit 打开注册表。
找到 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows Kits\Installed Roots 并选中。如果不存在则需要手动创建。
修改 KitsRoot10 为你期望的路径。如果存在多个类似字段则都需要修改。
从 Windows 官网下载 Windows SDK 安装器。
打开安装器安装 Windows SDK,此时的默认安装路径应为注册表中修改后的路径。
安装完毕后建议删除旧的 SDK。
执行 Rust 命令确认能否正常操作。
ninja.exe 不存在
-
depot_tools 工具包,一旦你 gclient 之后,ninja.exe 就消失了,然后启动生成的时候,第一个看到的就是 ninja.exe 不存在,这个工具包好像还不能乱升级,否则会报一个 ninja.py 的错误,这个错误没有其他办法,删了所有 depot_tools 重新再来一遍升级,瞎搞没用
depot_tools/ninja.py: Could not find Ninja in the third_party of
-
ninja.exe Chromium 源码下面的这个就可以用
路径错误
ValueError: path is on mount '\\\\tab_group_types.mojom-webui.js', start on mount 'E:'
还好有大佬给了解决方案,要追加一行代码(真不是一般人能想到的),这时候项目应该能编译起来了
讲讲为何使用的是 Chromium 源码中的 Clang 版本?
-
首先自己的代码自己解释,你必须要用 Chromium 中的 Clang,这个代码是用 ninja.exe 构建的,使用的 build.ninja 配置,这个配置里面有个 toolchain.ninja 配置,你如果想改这个 Clang 必须在 toolchain.ninja 中修改,但是基本改不了,否则 Chromium 跑不过去,我一开始因为 Clang 17 or newer 就把 Clang18 替换了这里的位置,结果报新的语法错误。
你可以全部编译通过,但是调试时提示不是 win32 应用程序,哈哈!
继续探索中....