ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CEF 3071 与 depot_tools 从版本选择到源码编译的完整指南

CEF 3071 与 depot_tools 从版本选择到源码编译的完整指南 简介cef3071 depot_tools.zip是一份面向CEF开发者的工具链压缩包标签“cef”点明它与Chromium Embedded Framework的关联。作为Chromium项目维护的自动化构建与版本控制工具集depot_tools内置Git版本管理、GYP/GN生成构建文件、Ninja执行编译以及gclient、Python脚本等辅助模块主要服务于需要自行编译、定制CEF或研究Chromium源码的C/桌面应用开发者能解决源码获取、依赖同步、构建配置和版本管理等基础环节。压缩包整体约162.54MBzip格式内置完整的depot_tools目录适合在Windows、Linux或macOS上快速搭建CEF构建环境。已有587人学习下载。借助这套工具开发者可以围绕CEF源码完成fetch拉取、gn gen生成工程、ninja编译与调试的完整链路省去手工搭配工具链的繁琐步骤快速为自己的应用嵌入Chrome渲染能力或按需定制CEF行为是CEF二次开发过程中实用且可复用的基础资源对于希望为应用添加浏览器能力或深度定制CEF的团队这套工具包能显著降低环境准备门槛。1. 先搞清楚 ceF 3071 和 depot_tools 在一条链路里的位置我最早看到 cef3071 depot_tools.zip 这个压缩包名字时第一反应是又有人把工具链和版本号揉在一起打包下载了。但实际动手做 CEF 二次开发的人都知道这几个词粘在一处恰恰暴露了我们最常遇到的场景你准备基于 CEF 3071 这个分支做定制或者你只是想用官方编好的二进制包却发现所有东西都绕不开一个叫 depot_tools 的工具集最后下载下来一堆 zip 压缩包还得先啃下解压和环境配置这一关。CEF 全称是 Chromium Embedded Framework本质上是把 Chromium 内核封装成一个可嵌入的浏览器框架方便你在自己的原生应用里塞一个浏览器或者直接基于它做深度定制。cef3071 这个四位数是 CEF 的版本号对应的是 Chromium 71 内核差不多是 2018 年底到 2019 年初那个时期的基线。为什么还要折腾这么老的版本因为很多企业项目、工业软件、医疗系统里的浏览器控件是基于某个特定内核版本做的稳定性验证换新版本等于重测一遍兼容性所以老版本的生命周期远比我们想象的长。depot_tools 则是 Chromium 源码管理体系的骨架。它不是单个工具而是一套 Python 脚本加可执行文件的集合包含 gclient、gn、ninja 这些核心成员。Chromium 的源码不是简单的 git clone 就能拿到手的它拆成几百个独立仓库靠 gclient 去同步和打补丁最后用 gn 生成编译配置、ninja 执行构建。CEF 的源码编译完全复用这套体系所以只要你想从源码编译 CEF 3071就一定绕不开 depot_tools。至于 zip在 CEF 的世界里出现频率极高。官方构建服务器产出的二进制包是 zipdepot_tools 的压缩包是 zip很多内网离线部署下传的也是 zip。看起来只是一层压缩壳但下载不完整、工具选错、中文乱码、分卷缺失这些破事全都能在这一步给你一个下马威。我一度觉得搞 CEF 开发的人如果把 zip 的姿势练熟了整个项目能少掉一半的返工时间。这篇文章我打算顺着一条真实操作路径来讲先判断你到底是该用现成二进制包还是源码编译再把 depot_tools 装好、把 cef3071 的源码拉下来最后集中解决 zip 包在使用阶段最容易踩的那些坑。这样看下来你就知道这个标题里三个关键词到底是怎么串成一条链的。2. 先定方案现成二进制包还是源码编译很多人一上来就问depot_tools 怎么装其实这是顺序错了。第一步应该先想清楚你到底要哪种形态的 CEF 3071。2.1 两种方案的真实差异官方 build 服务器会产出标准二进制包文件名长这样cef_binary_3.3071.x.y_windows32.tar.bz2也有 zip 格式。这个包里面是编译好的 DLL、Lib、资源文件、头文件、CMake 配置你拿回去直接链接就能跑整个过程不需要碰 depot_tools也不需要碰源码。源码编译就完全是另一回事了。你需要自己拉 Chromium 和 CEF 的全量源码用 depot_tools 管理依赖然后在本机跑几小时的编译。得到的产物和官方包本质上一样但你可以修改 CEF 源码里的 C 实现、加私有接口、改内核参数这是二进制包给不了的自由度。我做个对比如下对比项官方二进制包源码编译前置工具链不需要 depot_tools必须安装 depot_tools下载体积一两百 MB 级别Chromium 全量源码几十 GB编译时间无需编译视配置数小时起可定制程度只能调用公开 API可改内核、加补丁适合场景集成现有 CEF 功能深度定制、长期维护很多做集成开发的人其实只需要第一行的情况却被各种教程带偏一上来就跑源码编译白白烧掉几天时间。2.2 如何下载 cef3071 的官方二进制包如果你确认走二进制方案那就去 CEF 官方构建页面下载对应版本。注意三个筛选条件分支选 3071对应 Chromium 71平台选你的目标平台Windows、Linux、macOS 分开位数选 32 或 64和你宿主程序保持一致下载完成后zip 包解出来核心目录包括include头文件、libcef_dllC API 封装层源码、Release运行 DLL 和资源、Resources国际化、图标等。官方包里还带着 CMakeLists 和 libcef_dll_wrapper 的工程文件你在自己的 CMake 工程里直接 add_subdirectory 就能接进来。这里有个容易疏忽的点Release 目录下那一堆 pak、bin 文件必须和 DLL 放在一起发布少一个都会在运行时出现白屏或崩溃。我第一次接的时候只拷了 libcef.dll结果加载完没有任何界面输出查了半天才发现 Resources 目录没有带进去属于典型的二进制资源配套问题。2.3 什么情况下才需要 depot_tools 源码流程如果你有下面任一需求就认命走源码流程需要修改 CEF 源码实现比如自定义网络请求处理、改 GPU 初始化策略需要给 CEF 打官方没有的补丁或者合入自己内部的 Chromium 修改需要针对特定硬件平台做裁剪官方包满足不了需要长期跟着源码基线维护而不是用某个固定构建另外还有一种情况你能访问外网但内网要求从源码审计构建产物那也必须走这套。确定要源码编译了就进入下一节先解决 depot_tools 这个拦路虎。3. depot_tools 的安装与配置重点全在细节里depot_tools 官方推荐直接 git clone 拉取然后把它加进 PATH。但实际操作里坑基本集中在环境变量、Python 版本和更新策略这三块。3.1 标准安装步骤与路径策略我习惯在专门的工作目录下放工具链不建议塞进 C 盘系统路径。比如mkdir C:\dev\chromium cd C:\dev\chromium git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git然后设置环境变量Windows 下建议用 setx 永久写入setx PATH C:\dev\chromium\depot_tools;%PATH%有一个细节必须强调depot_tools 的路径要放在 PATH 最前面不能排在系统 Python 后面。因为 depot_tools 自带一个 Python 环境如果系统自带的 Python 先被找到gclient 立刻就会因为版本不匹配而报错。这种报错表面上看是Python 语法错误或者找不到模块实际上就是 PATH 顺序问题。验证工具链是否可用打开命令行跑一句gclient --version如果输出带版本号说明基本环境对了。这一步卡住的人不少原因大多是 PATH 没生效重开一个终端就好。3.2 应对老版本的两个环境变量这里要特别提醒cef3071 对应的是上古工具链新版 depot_tools 不一定完全兼容。我在实际拉这个版本的时候遇到过 gclient 脚本在 Python 3 环境下执行异常因为那个年代的 Chromium 源码还没完全迁移到 Python 3很多辅助脚本只认 Python 2。解决办法是把 depot_tools 更新策略停掉避免它拉最新版把自己升级到不兼容状态setx DEPOT_TOOLS_UPDATE 0如果你机器上还有旧版 Python 2.7并且安装路径能被找到可以临时把它的目录也加进 PATH让 gclient 在解析脚本时能找对解释器。注意这里只是环境准备阶段的小技巧不是所有场景都需要。另外编译 CEF 还需要通过 GN 和 Ninja 生成构建文件depot_tools 里已经带了它们不用额外安装。但你需要设置几个 CEF 相关的环境变量比如set CEF_USE_GN1 set GN_DEFINESis_official_buildtrue这是个非常容易被忽略的步骤。如果你不设置 CEF_USE_GNautomate.py 会尝试走旧的 GYP 构建流程而 CEF 3071 这个时期的主流构建已经切到 GN 了两边不一致会导致 configure 阶段各种诡异报错。3.3 多版本 depot_tools 共存的个人经验我本机经常要维护多个 CEF 版本不同版本对工具链的要求还不一样所以我没用全局 PATH 方案而是每次用一个命令行环境脚本去切换。思路很简单写一个 env_3071.bat在里面临时设置 PATH、DEPOT_TOOLS_UPDATE、GN_DEFINES用完退出命令行就复原。echo off set PATHC:\dev\chromium\depot_tools;%PATH% set DEPOT_TOOLS_UPDATE0 set CEF_USE_GN1 set GN_DEFINESis_official_buildtrue cmd /k这样切版本时不会互相污染。全局装一个 depot_tools 然后反复升级很容易出现拉旧版源码时工具链太新、拉新版源码时工具链缺功能的尴尬分开隔离反而省心。4. 拉取 CEF3071 源码的完整操作记录环境准备好之后真正的源码拉取流程不长但步骤之间的依赖很重错一步后面全崩。4.1 创建目录结构并获取 CEF 源码CEF 的源码管理方式和普通项目不太一样它本身是一个独立的仓库但里面塞了一堆脚本去拉 Chromium 的大仓库。我用的目录结构是这样C:\dev\chromium\ ├─ depot_tools\ ├─ cef\ │ ├─ automate.py │ ├─ CHROMIUM_BUILD_FILES.txt │ └─ ... └─ chromium_git\先在 chromium 目录下拉取 CEF 源码然后切换到 3071 分支cd C:\dev\chromium git clone https://github.com/chromiumembedded/cef.git cef cd cef git checkout 3071注意不要直接在 master 分支上跑自动化脚本必须切到对应分支。CEF 的分支号就是版本号3071 分支对应 cef3071 这个版本基线。4.2 用 automate.py 拉全量 Chromium 代码CEF 提供了一个官方自动化脚本 automate.py它会调用 gclient 把 Chromium 源码以及所有第三方依赖一次性同步下来。我用的命令大致是这样python automate.py --download-dirC:\dev\chromium\chromium_git --branch3071 --no-distrib参数含义逐个解释--download-dir 指定 Chromium 源码的根目录所有仓库都会放进去--branch 指定 CEF 的分支号改成 3071 就是拉这个版本--no-distrib 表示不自动编译发布包只同步源码这个步骤是耗时大项网络上慢的时候可能跑几个小时。最好用稳定的网络环境中间不要断网。如果中途失败可以重新跑一遍 automate.pygclient 有断点续传能力已经下好的会跳过。4.3 编译前的最后检查和第一个目标源码同步完成后先别急着开编。检查几个文件是否齐全src/cef/ 目录是否存在CEF 源码会被 gclient 放到 Chromium 源码树里src/cef/VERSION 文件里的版本号是否为 3071src/build/ 目录下是否有 config 相关文件我第一次拉完忘检查在第二个仓库漏同步的情况下直接开编结果 configure 阶段报找不到 cef_dll的错误。后来养成习惯任何自动化脚本跑完先花两分钟确认产物路径对不对。确认无误后回到 cef 源码目录再执行一次带编译参数的 automate.pypython automate.py --download-dirC:\dev\chromium\chromium_git --branch3071 --no-distrib --build-log-file这里新加了 --build-log-file编译日志会记录到文件里排查崩溃和链接错误时非常有用。整个编译过程对 CPU 和内存消耗巨大我建议至少 16GB 内存否则中途容易崩。5. 源码编译后的链接方案源码编译完成后产出物在哪、怎么用和下载官方二进制包的姿势有些区别。5.1 编译产物布局automate.py 跑完后编译产物一般在 C:\dev\chromium\chromium_git\src\out\Release_GN 或类似目录下。里面有 libcef.dll、cef.pak、icudtl.dat、v8_context_snapshot.bin 这些文件以及生成的头文件。如果用官方目录结构来对比include/ 目录对应源码里的 out/Release_GN/gen/cef/includelibcef_dll 的封装源码对应 src/cef/libcef_dll运行时资源对应 out/Release_GN 根目录下的各种 pak、bin、dat5.2 把自己的工程和编译产物对接自己的 CMake 工程里我习惯不走官方那种 add_subdirectory 方案而是直接把目录指过去。比如set(CEF_BINARY_DIR C:/dev/chromium/chromium_git/src/out/Release_GN) include_directories(${CEF_BINARY_DIR}/gen/cef/include) link_directories(${CEF_BINARY_DIR}) target_link_libraries(your_app libcef.lib)链接后启动程序前把 libcef.dll 和所有资源文件复制到可执行文件目录。源码编译产物和官方二进制包在运行时的行为一致资源文件不全会白屏。我踩过最狠的一次是忘了复制 v8_context_snapshot.bin界面能起来但 JS 执行全部静默失败页面看起来一片空白排查了很久。5.3 链接时的常见链接错误源码编译产物很容易出现和官方包不同的链接错误。比如引入头文件时官方包自带的是封装好的 C API 头文件而源码编译产物里的头文件路径可能不同编译器会报找不到某个头文件。我遇到过的实际问题把 include 目录配错编译时找不到 cef_base.hlib 路径配到 Debug 产物目录和项目运行库冲突没有链接在源码编译时额外生成的 libcef_dll_wrapper导致大量 unresolved external symbol解决方案就是逐一核对产物目录下的实际文件不要凭记忆填路径。源码编译生成的目录结构不会和你之前用官方包时的目录结构完全一样先 ls 看清楚再写 CMake。6. 从这次版本准备里总结出的几条实用经验整个流程跑下来我自己印象最深的一点是CEF 版本准备这件事真正耗时间的不是编译而是反复猜测环境哪里不对。以下几条是我个人筛了一遍之后留下的经验。第一先确认自己到底要不要源码编译。我见过太多人只是想在应用里嵌一个网页控件却跑了一遍全量 Chromium 编译折腾几天之后又回到官方二进制包的路径上。判断标准很简单你需不需要改 C 源码不需要就下载官方构建包没人规定你要自己造轮子。第二版本号对应关系要提前查清楚。cef3071 是 CEF 分支号对应 Chromium 71两者在 CEF 版本页能查到对应表。由于不同分支的代码结构差异很大编译脚本的参数和行为也可能变别拿新版的命令直接套老版本。第三zip 这个环节真的要重视。源码和工具链各种 zip 包下载时尽量检查完整性。即使是从官方源下载也可能因为网络问题拿到一个损坏的压缩包。解压失败先不要怀疑操作先确认文件大小和哈希值再检查是不是分卷文件缺失。我后来自己写了一个简单的完整性校验脚本下载完所有 zip 先批量测试再统一解压省掉了很多不必要的等待时间。最后再说一个细节。如果你经常需要重新准备环境建议把整个目录结构固化下来包括 depot_tools 的位置、cef 源码的位置、Chromium 源码的位置不要每次换路径。depot_tools 内部有大量绝对路径引用移动目录之后 gclient 经常出现意想不到的错误。路径稳定了环境就稳定了这才是 CEF 版本准备里最大的定心丸。本文还有配套的精品资源点击获取
返回列表