Chromium内核浏览器编译记(四)Linux版本CEF编译
转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/136508294
本文出自 容华谢后的博客
0.写在前面
本篇文章是用来记录编译Linux版本CEF的步骤和踩过的坑,以防止后续再用到的时候忘记,同时也希望能够帮助到遇到同样问题的同学。
简单介绍下CEF,CEF的全称是Chromium Embedded Framework(Chromium嵌入式框架),它是一个开源的软件框架,用于嵌入Chromium浏览器引擎到其他应用程序中。允许开发者将Chromium的强大的Web渲染引擎嵌入到他们自己的应用程序中,以实现内嵌的浏览器功能,目前支持Windows、Linux、macOS平台。
本文的开发环境使用的是VMware虚拟机,在上面安装了Ubuntu 20.04.4 64位操作系统,分配了200G的硬盘空间,16G内存,12核心CPU,编译时间大概在5小时左右。
1.准备工作
因为Chromium的源码都在外面的世界,所以在下载源码之前,先要在Ubuntu系统上开启代理,本文中使用的是Clash工具,在GitHub中可以搜索到Linux版本客户端。
1.1 安装Git
使用以下命令安装:
sudo apt-get install git
设置Git网络代理:
git config --global http.proxy http://127.0.0.1:端口号git config --global https.proxy https://127.0.0.1:端口号
下载源码的过程中,可能会报Git缓存的异常,可以通过以下命令把缓存设置的大一些:
sudo git config --global http.postBuffer 5242880000sudo git config --global https.postBuffer 5242880000
1.2 配置depot_tools
Chromium使用了depot_tools来管理代码,先通过Git拉取代码:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
配置环境变量:
export PATH="$PATH:$HOME/depot_tools"
注意:文章中是把depot_tool下载到了【home/用户名】目录下,所以使用【$HOME】代表,环境变量要根据实际下载的路径修改。
源码的位置在这里:
1.3 配置下载工具代理
在【home/用户名】目录下新建一个**.boto**文件:
[boto]
proxy=127.0.0.1
proxy_port=端口号
配置环境变量:
export NO_AUTH_BOTO_CONFIG="$PATH:$HOME/.boto"
2.源码下载
2.1 创建目录结构
当前处于【home/用户名】目录下,执行以下命令,创建几个文件夹:
mkdir CEF && cd CEF && mkdir automate && mkdir chromium_git
最终的目录结构是这样的:
~/CEF/automate/automate-git.py/chromium_git/cef/chromium/update.sh~/depot_tools/
2.2 下载automate-git.py脚本
当前在CEF目录下,需要切换到automate目录下,执行下面的命令下载脚本:
cd automatewget https://bitbucket.org/chromiumembedded/cef/raw/master/tools/automate/automate-git.py
2.3 创建update.sh脚本
当前在automate目录下,需要切换到chromium_git目录下:
cd ..cd chromium_git
脚本内容:
python3 ../automate/automate-git.py --download-dir=/home/alidili/CEF/chromium_git --branch=5414 --chromium-checkout=109.0.5414.120 --depot-tools-dir=/home/alidili/depot_tools --no-distrib --no-build
其中 --branch 是CEF的分支版本,可以指定需要的版本,如果需要最新版本直接去掉这个参数就可以,–chromium-checkout 是Chromium源码的Tag版本,如果不需要指定可以去掉。注意如果需要指定版本,CEF的版本和Chromium的版本要保持一致。
–download-dir 后的路径修改成你设备上的实际路径,alidili是用户名,–depot-tools-dir 改成在1.2中下载的depot_tools的路径。
2.4 下载源码
当前在chromium_git目录下,执行下面的命令:
chmod 755 update.sh./update.sh
可以看到下面的进度提示:
提示这个就代表下载完了,如果中途下载失败了,重新执行上面的命令就可以了:
3.源码编译
3.1 支持音视频
源码下载完成后,需要修改下支持音视频,打开这个头文件:
chromium_git/chromium/src/third_party/ffmpeg/chromium/config/Chromium/linux/x64/config_components.h
#define CONFIG_SIPR_PARSER 1 由0修改为1,启用FFmpeg。
3.2 生成工程
终端输入这个命令:
export GN_DEFINES="use_sysroot=true symbol_level=1 is_cfi=false use_thin_lto=false use_vaapi=false ffmpeg_branding=Chrome proprietary_codecs=true is_official_build=true use_gnome_keyring=false chrome_pgo_phase=0"
当前在chromium_git目录下,切换到cef目录下,执行生成工程脚本:
cd chromium/src/cef./cef_create_projects.sh
看到这个提示就代表构建成功了:
3.3 编译cefclient与chrome_sandbox
当前在cef目录下,切换到src目录下,终端输入下面的命令:
cd ..ninja -C out/Release_GN_x64 cefclient chrome_sandbox
如果想要生成Debug版本,Release_GN_x64改成Debug_GN_x64就可以了。
编译过程十分漫长,大概五六个小时,看到下面的提示就代表编译成功了:
生成的文件如下:
3.4 生成CEF二进制分发包
当前在src目录下,切换到tools目录下,执行下面的命令:
cd cef/tools./make_distrib.sh --ninja-build --minimal --x64-build
这个过程还比较快,出现下面的提示就成功了:
生成的文件如下:
到这里整个CEF就编译完成了。
生成的cefclient在/home/alidili/CEF/chromium_git/chromium/src/out目录下
生成的分发包在/home/alidili/CEF/chromium_git/chromium/src/cef/binary_distrib目录下
4.遇到的问题
4.1 磁盘空间
源码+编译缓存大概会占用100多G的空间,如果用虚拟机的话,硬盘空间一定要预留够,大概200G差不多。
4.2 depot_tools环境变量
Chromium是使用depot_tools来管理源码的,如果拉取源码的时候,提示找不到fetch指令,那一定是环境变量的问题了,仔细看下路径设置的对不对。
4.3 Git网络代理
记得一定要给Git设置网络代理,不能拉取源码会一直超时,梯子我用的收费的Ghelper,里面有Clash的订阅。
4.4 下载源码不全怎么办
在2.4步骤中,使用update.sh下载源码,因为Chroium源码比较大,中间可能因为网络原因,导致下载超时或者个别文件下载不全,这个时候再次执行update.sh也可能同步不全。
这个时候,在 /CEF/chromium_git/chromium/src 目录下执行下面的命令同步Chromium的源码:
gclient sync
4.5 编译总是失败
编译的时候可能会报一些异常,这些异常大部分是因为源码不全导致的,使用下面的命令重置下代码:
git reset --hard
然后删除 /CEF/chromium_git 目录和 /CEF/chromium_git/chromium/src 目录下的cef目录,然后重新执行update.sh脚本即可。
4.6 编译过程中提示:No such file or directory: ‘gcc’
提示缺什么库,通过下面的命令安装什么就可以了:
sudo apt install gcc
4.7 编译过程中提示:提示 gtk/gtk.h file not found
同4.6,缺什么安装什么就可以了:
sudo apt-get install libgtk-3-0sudo apt install libgtk-3-dev
安装了上面的gtk库,有可能还是提示找不到,配置下环境变量:
export CPATH=$CPATH:/usr/include/gtk-3.0
export CPATH=$CPATH:/usr/include/gtk-3.0/gtk
export CPATH=$CPATH:/usr/include/gtk-3.0/gdk
export CPATH=$CPATH:/usr/include/gtk-3.0/unix-print
4.8 不要尝试修改源码解决编译问题
编译中遇到的99%的问题都是因为源码不全或者缺少相关库导致的,不要试图修改源码解决问题,不然会发送连锁的错误反应浪费时间。
如果遇到编译无论如何都过不了的问题,相信我,不要做别的操作了,删除所有源码,重新按照步骤再来一遍。
5.写在最后
下载和编译的过程中,可能会遇到各种各样奇怪的问题,奇怪到各个搜素引擎都搜不到答案,ChatGPT也给不出切实的解决方案,不断的查搜索引擎、查文档、查StackOverFlow,不断的换提问的方式,查到头脑发昏心情不好,这个时候千万不要放弃,问题离解决只差一步了,当看到编译成功的提示时,一切都是值得的,守得云开见月明。
到这里,Chromium CEF源码的编译就完成了,有问题可以给我留言评论,谢谢。
相关文章:

Chromium内核浏览器编译记(四)Linux版本CEF编译
转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/136508294 本文出自 容华谢后的博客 0.写在前面 本篇文章是用来记录编译Linux版本CEF的步骤和踩过的坑,以防止后续再用到的时候忘记,同时也希望能够帮助到遇到同样问…...

NextJs教程系列(一):介绍安装
什么是 Next.js Next.js 是一个用于构建全栈 Web 应用程序的 React 框架。您可以使用 React 组件来构建用户界面,并使用 Next.js 来构建其他功能和优化。 Next.js 的特点 构建全栈 Web 应用程序的 React 框架。为 React 提供了开箱即用的服务器端渲染。为 React …...

python界面开发 - Menu (popupmenu) 右键菜单
文章目录 1. python图形界面开发1.1. Python图形界面开发——Tkinter1.2. Python图形界面开发——PyQt1.3. Python图形界面开发——wxPython1.4. Python图形界面开发—— PyGTK:基于GTK1.5. Python图形界面开发—— Kivy1.6. Python图形界面开发——可视化工具1.7. …...

微服务架构 | 多级缓存
INDEX 通用设计概述2 优势3 最佳实践 通用设计概述 通用设计思路如下图 内容分发网络(CDN) 可以理解为一些服务器的副本,这些副本服务器可以广泛的部署在服务器提供服务的区域内,并存有服务器中的一些数据。 用户访问原始服务器…...

怎么将pom在文件放到src下方
今天在IDEA从git拉取项目的时候,发现pom.xml文件在文件夹src的上方,平时看惯了项目的pom.xml文件在文件夹src的下方,应该怎么去设置呢? 点击设置——>点击Folder Always on Top 即可 参考:http://t.csdnimg.cn/s34…...
浅谈网络爬虫与Web安全
网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种按照一定的规则自动抓取万维网资源的程序或者脚本,已被广泛应用于互联网领域。搜索引擎使用网络爬虫抓取Web网页、文档甚至图片、音频、视频等资源,…...

C++vector的使用方法
文章目录 一、vector的介绍1. 文档链接2. 简要介绍 二、vector的使用1.vector的定义(1)构造函数(2)拷贝构造函数(2)赋值重载 2. vector 增删查改(1)operator [](2&#x…...
视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet
视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet 真没想到,举例视频生成上一轮的集中爆发才过去三个月,没想OpenAI一出手,该领域又直接变天了自打2.16日OpenAI发布sora以来,不但把同时…...

4.1k star,官方出品的redis桌面管理工具——redislnsight
导航 令人抓狂的大key加载RedisInsight 简介RedisInsight的亮点GitHub 地址安装和使用RedisInsight 下载安装 使用RedisInsight redis数据库可视化直观的CLI(Command-Line Interface)日志分析和命令分析 结语参考 令人抓狂的大key加载 工欲善其事必先利…...

论文目录3:大模型时代(2023+)
1 instruction tuning & in context learning 论文名称来源主要内容Finetuned Language Models Are Zero-Shot Learners2021 机器学习笔记:李宏毅ChatGPT Finetune VS Prompt_UQI-LIUWJ的博客-CSDN博客 早期做instruction tuning的work MetaICL: Learning to …...

FPGA IBUFG
IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接,与普通IO和其它内部CLB等没有物理连接。 所以,IBUFG输入的不能直接接另外信号。 GTH transceiver primitives are called GTHE3_COMMON and GTHE3_CHANNEL in UltraScale FPGAs, an…...

探索数据结构:单链表的实战指南
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty‘s blog 前言 在上一章节中我们讲解了数据结构中的顺序表,知道了顺序…...

短视频矩阵系统----矩阵系统源码搭建(技术门槛?)
短视频矩阵是什么意思?短视频矩阵的含义可以理解为全方位的短视频账号,通过不同的账号实现全方位的品牌展示。实际上是指一个短视频账号,通过不同的链接实现品牌展示,在不同的粉丝流量账号中互相转发同一个品牌,在主账…...

Spring事务注解@Transactional的流程和源码分析
Spring事务简介 Spring事务有两种方式: 编程式事务:编程式事务通常使用编程式事务管理API实现,比如Spring提供的PlatformTransactionManager接口,使用它手工编码去操控事务。声明式事务:注解式事务使用AOP࿰…...

在别的地方下载的二次封装Windows镜像怎么安装?GHO镜像详细安装教程
前言 在系统之家或者其他地方下载的镜像文件怎么装到电脑上? 首先要知道系统之家下载的Windows镜像文件基本上都是.iso结尾的,要进入到对应镜像包才能看出系统镜像是什么格式。 如何分辨镜像的格式 选择对应的.iso镜像,点击【鼠标右键】-【装…...
使用Lerna + Yarn Workspace管理Monorepo项目
1.前言 通常,我们会根据自身业务的实际情况,将通用的组件、逻辑等提取成NPM包,方便以后复用。但这些提取出来的NPM包可能互相之间存在依赖,如果仍然采用 Multirepo 的形式进行管理,则在包的版本管理、依赖管理、调试等…...
如何将gzip后缀压缩包重命名任意后缀名并依然通过gzip.open()读取压缩包文件内容
在 Python 中,gzip.open() 用于解压缩 .gz 后缀的文件。因此,如果您将文件的后缀从 .gz 更改为其他后缀,例如 .diy,然后尝试使用 gzip.open() 打开它,会导致失败,因为 Python 会尝试使用 gzip 解压缩它&…...

C语言从入门到精通 第十一章(文件操作)
写在前面: 本系列专栏主要介绍C语言的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程。除了参考下面的链接教程以外,笔者还参考了其它的一些C语言教材,笔者认为重要的部分大多都会用粗体标注…...
安装安卓studio无法下载sdk解决方法
安装安卓studio无法下载sdk的解决方法如下: 因为google被墙了,android sdk无法下载。 只要修改host文件,就可以下载sdk了。host文件的位置在:C:\Windows\System32\drivers\etc\hosts host文件添加如下内容: #google_…...

express+mysql+vue,从零搭建一个商城管理系统10--添加商品
提示:学习express,搭建管理系统 文章目录 前言一、新建models/goods.js二、新建routes/goods.js三、添加goods表四、添加商品总结 前言 需求:主要学习express,所以先写service部分 一、新建models/goods.js models/goods.js con…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...