CEF132 编译指南 Linux 篇 - CEF 编译实战:构建 CEF(六)

1. 引言
经过前几篇的精心准备,我们已经完成了所有必要的环境配置和源码下载。现在,我们将进入激动人心的 CEF 编译阶段。本篇将详细指导你在 Linux 系统上编译 CEF 6834 分支(对应 Chromium 132 版本),包括创建项目文件、执行编译过程以及处理可能遇到的问题。按照本篇的步骤,你将能够成功构建 CEF 的发布版本。
2. 编译前的准备工作
2.1 确认环境变量
在开始编译之前,我们需要再次确认必要的环境变量已正确设置:
# 检查环境变量
echo $GN_DEFINESecho $CEF_ARCHIVE_FORMAT
# 如果未设置,重新设置
export GN_DEFINES="is_official_build=true use_sysroot=true symbol_level=1 is_cfi=false proprietary_codecs=true ffmpeg_branding=Chrome"
export CEF_ARCHIVE_FORMAT=tar.bz2
2.2 确认源码位置
验证源码目录结构是否正确:
cd ~/cef132/chromium_git/chromium/src/cef
ls -la
3. 生成项目文件:构建的蓝图
3.1 执行项目生成脚本
cd ~/cef132/chromium_git/chromium/src/cef
./cef_create_projects.sh

重要提示: 如果你修改了任何 GN 配置文件(如 BUILD.gn),都需要重新运行此脚本,以确保构建配置的正确性。
4. 执行编译:CEF 的诞生
4.1 使用 automate-git.py 执行编译
现在,我们可以使用 automate-git.py 脚本执行完整的编译过程:
cd ~/cef132/automate
python3 ./automate-git.py \ --download-dir=/home/$USER/cef132/chromium_git \ --depot-tools-dir=/home/$USER/depot_tools \ --branch=6834 \ --minimal-distrib \ --client-distrib \ --force-clean \ --build-target=cefsimple \ --x64-build \ --no-debug-build \ --with-pgo-profiles \ --no-chromium-update
参数说明:
--branch=6834:指定 CEF 132 版本对应的分支。--minimal-distrib:生成最小化分发包,包含运行 CEF 的最小文件集。--client-distrib:生成客户端分发包,包含用于开发 CEF 应用程序的头文件和库文件。--force-clean:强制清理之前的构建文件,确保构建的纯净性。--build-target=cefsimple:指定构建目标为 cefsimple 示例程序,用于验证编译结果。--x64-build:指定构建 64 位版本的 CEF。--no-debug-build: 取消编译debug版本--with-pgo-profiles:使用 PGO(Profile-Guided Optimization)优化配置,提升性能。
4.2 使用 Ninja 直接构建
如果你需要单独构建某个组件,或者进行增量构建,可以直接使用 Ninja:
cd ~/cef132/chromium_git/chromium/srcautoninja -C out/Release_GN_x64 cefsimple
5. 验证编译成果
5.1 检查输出文件
编译完成后,检查输出目录,确认编译生成的文件:
cd ~/cef132/chromium_git/chromium/src/out/Release_GN_x64ls -la
5.2 运行 cefsimple 示例程序
运行编译生成的 cefsimple 示例程序,测试 CEF 是否正常工作:
cd ~/cef132/chromium_git/chromium/src
./out/Release_GN_x64/cefsimple

6. 常见问题及优化建议
6.1 编译错误解决方案
- 内存不足:
# 增加交换分区大小
sudo swapoff -asudo fallocate -l 16G /swapfile
# 或者更大的swap空间,根据你自己的情况
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
- 构建超时:
# 重新运行编译命令,Ninja 会从上次中断的地方继续编译
python3 automate-git.py [之前的参数]
- 依赖错误:
# 更新系统并重新安装依赖sudo apt-get update && sudo apt-get upgrade
sudo python3 ~/cef132/install-build-deps.py --no-arm --no-chromeos-fonts --no-nacl
6.2 编译优化建议
- 提高编译速度:
# 使用多线程编译,利用所有 CPU 核心
export NINJA_JOBS=$(nproc)
- 减少内存使用:
# 限制 Ninja 的并行任务数,避免内存耗尽
export NINJA_JOBS=4 # 或者更小的数字,具体取决于你的机器配置
7. 结语
至此,我们完成了 CEF 6834 分支(对应 Chromium 132 版本)在 Linux 环境下的完整编译过程。通过遵循本系列文章的指导,你应该已经成功构建了 CEF 框架。这个过程虽然复杂,但是通过正确的配置和耐心的执行,我们最终达到了目标。
CEF 的编译是一个对系统资源要求较高的过程,可能会遇到各种挑战。但是通过本系列文章的指导,相信你已经掌握了在 Linux 环境下编译 CEF 的完整知识。如果在实践中遇到问题,请参考本文提供的故障排除指南,或查阅 CEF 官方文档获取更多信息。希望你能享受到CEF带来的便利,祝你开发工作一切顺利!
相关文章:
CEF132 编译指南 Linux 篇 - CEF 编译实战:构建 CEF(六)
1. 引言 经过前几篇的精心准备,我们已经完成了所有必要的环境配置和源码下载。现在,我们将进入激动人心的 CEF 编译阶段。本篇将详细指导你在 Linux 系统上编译 CEF 6834 分支(对应 Chromium 132 版本),包括创建项目文…...
奥比中光3D机器视觉相机能连接halcon吗?
奥比中光的设备与Halcon的兼容性可以通过以下方式实现: 数据接口的通用性 奥比中光的相机(如Astro Pro、大白等)支持通过UVC协议获取彩色图像,深度数据则通过OpenNI或ROS2接口传输105。若Halcon支持这些协议或标准接口(如ROS消息、OpenCV图像流),则可通过直接调用或二次…...
【Spring+MyBatis】_图书管理系统(上篇)
目录 1. MyBatis与MySQL配置 1.1 创建数据库及数据表 1.2 配置MyBatis与数据库 1.2.1 增加MyBatis与MySQL相关依赖 1.2.2 配置application.yml文件 1.3 增加数据表对应实体类 2. 功能1:用户登录 2.1 约定前后端交互接口 2.2 后端接口 2.3 前端页面 2.4 单…...
【苍穹外卖】学习
软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责, 并了解软件开发中涉及到的三种软件环境。那么这一小节,我们将从 软件开发流程、角色…...
DeepSeek-V2-技术文档
DeekSeek-v2-简述 1. DeepSeek-V2是什么? DeepSeek-V2是一个基于混合专家(Mixture-of-Experts,简称MoE)架构的语言模型。它是一种新型的人工智能模型,专门用于处理自然语言处理(NLP)任务,比如文本生成、翻译、问答等。与传统的语言模型相比,DeepSeek-V2在训练成本和…...
VictoriaLogs Syslog日志收集存储系统部署
Docker部署 启动命令 使用以下命令通过Docker启动VictoriaLogs容器: docker run -d --restart always \-p 9428:9428 \-p 514:514/udp \-v ./victoria-logs-data:/victoria-logs-data \--name victoria-logs-syslog-songxwn.com \docker.io/victoriametrics/victor…...
使用 Apache PDFBox 提取 PDF 中的文本和图像
在许多应用中,我们需要从 PDF 文件中提取文本内容和嵌入的图像。为了实现这一目标,Apache PDFBox 是一个非常实用的开源工具库。它提供了丰富的 API,可以帮助我们轻松地读取 PDF 文件、提取其中的文本、图像以及其他资源。 本文将介绍如何使…...
Linux中线程创建,线程退出,线程接合
线程的简单了解 之前我们了解过 task_struct 是用于描述进程的核心数据结构。它包含了一个进程的所有重要信息,并且在进程的生命周期内保持更新。我们想要获取进程相关信息往往从这里得到。 在Linux中,线程的实现方式与进程类似,每个线程都…...
Groovy语言的学习路线
Groovy语言的学习路线 引言 在当前的编程世界中,随着多种编程语言的涌现,开发者常常需要选择合适的语言来满足项目的需求。Groovy语言作为一种动态语言,在Java虚拟机(JVM)环境中得到了广泛使用。它具有简单易用的语法…...
nlf 3d pose 部署学习笔记
目录 multi_hmr创建SemanticRenderer 推理代码 渲染代码: 调用原版render,没成功 用的pose和smlx生成vertices,也有vertices3d hmr2,用的是网络生成的vertices进行渲染。 nlf地址: GitHub - isarandi/nlf: [NeurIPS 2024] Neural Localizer Fields for Continuous …...
【vmware虚拟机安装教程】
以下是在VMware Workstation Pro上安装虚拟机的详细教程: 准备工作 下载VMware Workstation Pro 访问VMware官网下载并安装VMware Workstation Pro(支持Windows和Linux系统)。安装完成后,确保已激活软件(试用版或正式…...
window中git bash使用conda命令
window系统的终端cmd和linux不一样,运行不了.sh文件,为了在window中模仿linux,可以使用gui bash模拟linux的终端。为了在gui bash中使用python环境,由于python环境是在anaconda中创建的,所以需要在gui bash使用conda命…...
PHP语法完全入门指南:从零开始掌握动态网页
本文专为零基础新手设计,通过5000字详细讲解带你系统学习PHP语法。包含环境搭建、基础语法、实战案例,并附20+代码示例。阅读后你将能独立开发简单动态网页! 一、PHP开发环境搭建(新手必看) 1.1 为什么需要搭建环境? PHP是服务器端脚本语言,需要运行在服务器环境中。推…...
什么是蒸馏技术
蒸馏技术(Knowledge Distillation, KD)是一种模型压缩和知识迁移的方法,旨在将一个复杂模型(通常称为“教师模型”)的知识转移到一个小型模型(通常称为“学生模型”)中。蒸馏技术的核心思想是通…...
Python——寻找矩阵的【鞍点】(教师:恒风)
在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点 恒风的编程 思路: 使用while循环找到行中最大值,此时列的坐标已知,利用列表推导式生成列不变的纵列,利用min()函数得到纵…...
处理项目中存在多个版本的jsqlparser依赖
异常提示 Correct the classpath of your application so that it contains a single, compatible version of net.sf.jsqlparser.statement.select.SelectExpressionIte实际问题 原因:项目中同时使用了 mybatis-plus 和 pagehelper,两者都用到了 jsqlpa…...
【iOS】包大小和性能稳定性优化
包大小优化 图片 LSUnusedResources 扫描重复的图片 ImageOptim,压缩图片 压缩文件 优化音视频资源 ,使用MP3 代替 WAV ffmpeg -i input.mp3 -b:a 128k output.mp3 视频 H.265(HEVC) 代替 H.264 ffmpeg ffmpeg -i input.mp4 -vcodec lib…...
Delphi语言的软件工程
Delphi语言的软件工程 引言 在软件工程的历史长河中,Delphi语言作为一种快速应用程序开发(RAD)的工具,凭借其高效的开发环境和强大的编程能力,一直在软件开发领域占有一席之地。本文将探讨Delphi语言的历史背景、特性…...
Jenkinsdebug:遇到ERROR: unable to select packages:怎么处理
报错信息: 报错信息解释: musl-1.2.5-r0 和 musl-dev-1.2.5-r1: 这里说明 musl-dev 需要一个特定版本的 musl,即 musl1.2.5-r1,但是当前版本的 musl(1.2.5-r0)并不满足这个条件。版本冲突: 当尝试安装新…...
3、树莓派5 安装VNC查看器 开启VNC服务器
在前序文章中( 2、树莓派5第一次开机),可以使用三种方式开机,其中使用网线及wifi的方式均需要使用到VNC查看器进行远程桌面控制,本文将介绍如何下载安装并配置及使用VNC查看器及服务器,对前序文章做一些补充…...
数据结构——单向循环链表、双链表、双向循环链表
目录 一、单向循环链表 1.1 单向循环链表的概念 1.2 单向循环链表的操作 1.2.1 单向循环链表的创建 1.2.2 单向循环链表的头插 1.2.3 单向循环链表的遍历 1.2.4 单向循环链表的头删 1.2.5 单向循环链表的尾插 1.2.6 单向循环链表的尾删 1.2.7 约瑟夫环 1.3 单向循环列表所有程…...
冒险岛079 V8 整合版源码搭建教程+IDEA启动
今天教大家来部署下一款超级怀旧游戏冒险岛,冒险岛源码是开源的,但是开源的代码会有各种,本人进行了加工整合,并且用idea进行了启动测试,经过修改后没有任何问题。 启动截图 后端控制台 前端游戏界面 声明 冒险岛源码…...
Qwen2-VL 的重大省级,Qwen 发布新旗舰视觉语言模型 Qwen2.5-VL
Qwen2.5-VL 是 Qwen 的新旗舰视觉语言模型,也是上一代 Qwen2-VL 的重大飞跃。 Qwen2.5-VL主要特点 视觉理解事物:Qwen2.5-VL不仅能够熟练识别花、鸟、鱼、昆虫等常见物体,而且还能够分析图像中的文本、图表、图标、图形和布局。 代理性&…...
详解CountDownlatch
引言 CountDownLatch 是 Java 并发包 java.util.concurrent 中的一个同步工具类,由著名的并发编程大师 Doug Lea 所开发。它允许一个或多个线程等待其他线程完成操作后再继续执行,其核心思想是通过一个计数器,对计数器进行调度来实现 原理 …...
STM32外设SPI FLASH应用实例
STM32外设SPI FLASH应用实例 1. 前言1.1 硬件准备1.2 软件准备 2. 硬件连接3. 软件实现3.1 SPI 初始化3.2 QW128 SPI FLASH 驱动3.3 乒乓存储实现 4. 测试与验证4.1 数据备份测试4.2 数据恢复测试 5 实例5.1 参数结构体定义5.2 存储参数到 SPI FLASH5.3 从 SPI FLASH 读取参数5…...
【Excel笔记_6】条件格式和自定义格式设置表中数值超过100保留1位,超过1000保留0位,低于100为默认
方法一:自定义格式 选中需要设置格式的单元格区域。右键选择设置单元格格式,或者在工具栏中选择开始 -> 数字 -> 自定义格式。在类型框中输入以下自定义格式: [>1000]0;[>100]0.0;G/通用格式解释: [>1000]0&…...
Java零基础入门笔记:(1-2)入门(简介、基础知识)
前言 本笔记是学习狂神的java教程,建议配合视频,学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili - Java简介 Java是一种广泛使用的高级编程语言,具有简单、面向对象、分布式、多线程、动态性、健壮性和安全…...
Unreal5从入门到精通之使用 BindWidget 将 C++ 连接到 UMG 蓝图
文章目录 前言示例代码BindWidget使用C++的优缺点可选小部件其他特性前言 如果你开始制作基于 C++ 的 UI,你最常遇到的一个问题是: 如何使用 C++ 来控制蓝图创建的小部件? 这个问题的答案是BindWidget元属性。 BindWidget 示例 UPROPERTY(BlueprintReadWrite, meta = (…...
Java 基于 SpringBoot+Vue 的动漫平台(附源码,文档)
博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
微信小程序 - 网络请求基础路径集中管理(基础路径集中管理策略、动态切换基础路径)
一、基础路径集中管理 在微信小程序项目开发中,经常会将请求的基础路径集中管理 这样可以避免在多个页面中重复定义,同时也方便后续维护与修改 二、基础路径集中管理策略 1、使用全局变量 微信小程序提供了 App 对象,可以在 app.js 中定义…...
