CEF即Chromium Embedded Framework,Chrome浏览器嵌入式框架。我们可以从自制浏览器入手,深入学习它。它提供了接口供程序员们把Chrome放到自己的程序中。许多大型公司,如网易、腾讯都开始使用CEF进行前端开发,小如网易的Minecraft启动器,大如微信电脑版,都可以使用前端技术进行开发。把C++或者其他编程语言于HTML相结合的CEF,能够实现更好的效果。但一旦你决定开始学CEF,就不可避免地会掉到坑里:中文文档参差不齐,官方文档着重于Linux,很多时候甚至不能自己成功编译CEF!经过2-3天的来回查阅,终于成功编译了cefsimple示例。希望这篇文档能帮你躲过一些坑!在文章的最后,你会得到一个属于你自己的浏览器!

1.下载CEF

使用cef有两种办法:自己编译源码,或者使用编译好内核的半成品,除非你是老练的Linux高手,否则还是建议使用后者,直接下载半成品是最快速,简洁的办法了。这个半成品叫做libcef。下载libcef的官方网址是http://cefbuilds.com/,这个网站已经被墙。你也可以尝试在:http://opensource.spotify.com/cefbuilds/index.html这个映像站下载,不过可能要等上1-2天了。建议挂在远程服务器上下载,或者开代理下载。打开网站后,在页面最底部找到Windows 32-bit Build或Windows 64-bit Build,然后下载。

注意:如果你考虑兼容32位计算机,那可以选择Windows 32-bit Build。但Windows 64-bit Build可以提供超过4GB的内存支持,多页面的话能提升性能(毕竟Chrome很吃内存的)。用Visual Studio在64位计算机编译32位程序会出现一些问题,比如CEF会导致编译失败。如果你打算兼容32位,那就需要找一台32位计算机来编译了。这里使用64位版本。

2.Cmake生成解决方案

下载并解压之后,你应该会得到这些文件:

这时你肯定会疑惑:我的sln和vcproj呢?答案是——你需要使用Cmake。Cmake是一款跨平台的编译辅助工具,如果你在Windows,他可以生成sln和vcproj这样兼容Visual Studio的项目,如果你在Linux,那他也可以生成make这样兼容gcc编译器的项目。这样项目管理者可以一劳永逸,不用分别为Windows、Linux、Mac分别编写项目文件。

Cmake官网也被墙了,你可以挂代理或者从下载站下载它。你需要下载最新版本,可以兼容Visual Studio 2019。打开Cmake:

在Where is the source code框中选择下载下来的cef文件夹,接着再在cef文件夹中创建一个文件夹“build”,在Where to build binaries框中选择这个build文件夹,依次点击Configure——Generate生成文件,不出意料,你的程序就——出错了!

这是由于你选错了Visual Studio版本或者系统位数导致的,试着点击File——Delete Chche清除配置,重来一遍。

如果你生成成功,那你会看到这两条日志:

恭喜你,已经完成大半了!

3.使用Visual Studio编译

打开刚才创建的build文件夹,你会找到cef.sln这个solution(解决方案)文件:

打开它,可以看到这个解决方案下有几个项目:

点击“本地Windows调试器”按钮,不出意料,你的程序就——出错了!

什么也没有打开。不知道你留意到ALL_BUILD项目的名字是粗体字了吗?这表示Visual Studio只会编译和执行这一个项目。而我们希望搭建的是cefsimple项目,怎么办呢?右键cefsimple项目,找到“设为启动项目”。之后你会发现cefsimple变成了粗体,这就表明设置成功了。

点击“本地Windows调试器”按钮,不出意料,你的程序就——出错了!

又来?别担心,这应该是最后一次了,但这也是最头疼的一次。程序成功生成并运行了,但却提示“无法定位程序输入点PowerDeterminePlatformRoleEx于POWRPROF.dll上”!这让人十分抓狂。Debug?几十万行的Chrome怎么Debug,更何况还是半成品。作者只好先放在了一边。过了几天,在B站上偶然看到一篇Visual Studio的科普,提到了Debug和Release版本的区别。Debug是调试用版本,没有进行速度优化,而Release速度更快,但没办法使用断点等调试功能。试着把Debug换成Release:

在等待了几分钟后,编译成功了!这次成功生成了一个名为cefsimple的窗口,但却不显示任何内容。我们打开cefsimple->cefsimple->simpleapp.cc,找到第89行,可以看到他默认访问http://www.google.com/,难怪访问不了!

更改成baidu.com,再进行编译:

可以看到他成功访问了baidu.com!现在,我们也是可以开发浏览器的人了!

Enjoy it!

喜欢的话就点个赞吧!

CEF避坑指南(一)——编译并自制浏览器的更多相关文章

  1. CEF避坑指南(一)——下载并编译第一个示例

    CEF即Chromium Embedded Framework,Chrome浏览器嵌入式框架.它提供了接口供程序员们把Chrome放到自己的程序中.许多大型公司,如网易.腾讯都开始使用CEF进行前端开 ...

  2. electron 编译 sqlite3避坑指南---尾部链接有已经编译成功的sqlite3

    electron 编译 sqlite3避坑指南(尾部链接有已经编译成功的sqlite3) sqlite很好用,不需要安装,使用electron开发桌面程序,sqlite自然是存储数据的不二之选,奈何编 ...

  3. Harmony OS 开发避坑指南——源码下载和编译

    Harmony OS 开发避坑指南--源码下载和编译 本文介绍了如何下载鸿蒙系统源码,如何一次性配置可以编译三个目标平台(Hi3516,Hi3518和Hi3861)的编译环境,以及如何将源码编译为三个 ...

  4. Linux下Python3.6的安装及避坑指南

    Python3的安装 1.安装依赖环境 Python3在安装的过程中可能会用到各种依赖库,所以在正式安装Python3之前,需要将这些依赖库先行安装好. yum -y install zlib-dev ...

  5. 今天 1024,为了不 996,Lombok 用起来以及避坑指南

    Lombok简介.使用.工作原理.优缺点 Lombok 项目是一个 Java 库,它会自动插入编辑器和构建工具中,Lombok 提供了一组有用的注解,用来消除 Java 类中的大量样板代码. 目录 L ...

  6. Canal v1.1.4版本避坑指南

    前提 在忍耐了很久之后,忍不住爆发了,在掘金发了条沸点(下班时发的): 这是一个令人悲伤的故事,这条情感爆发的沸点好像被屏蔽了,另外小水渠(Canal意为水道.管道)上线一段时间,不出坑的时候风平浪静 ...

  7. Hive改表结构的两个坑|避坑指南

    Hive在大数据中可能是数据工程师使用的最多的组件,常见的数据仓库一般都是基于Hive搭建的,在使用Hive时候,遇到了两个奇怪的现象,今天给大家聊一下,以后遇到此类问题知道如何避坑! 坑一:改变字段 ...

  8. Android连接远程数据库的避坑指南

    Android连接远程数据库的避坑指南 今天用Android Studio连接数据库时候,写了个测试连接的按钮,然后连接的时候报错了,报错信息: 2021-09-07 22:45:20.433 705 ...

  9. spring-boot-starter-thymeleaf 避坑指南

    第一步:pom配置环境 先不要管包是做什么的 总之必须要有 否则进坑 <!--避坑包--> <dependency> <groupId>net.sourceforg ...

随机推荐

  1. jquery购物车全选,取消全选,计算总金额

    这是html代码 <div class="gwcxqbj"> <div class="gwcxd center"> <div cl ...

  2. spring框架bean注入

    今天学习了spring框架,刚刚入门简单的了解了spring并学习了bean的注入IOC:IOC(Inversion of Control,控制反转)不是什么技术,而是一种设计思想.它的目的是指导我们 ...

  3. 第3天 | 12天搞定Python,用VSCode编写代码

    Visual Studio Code (简称 VS Code), 是一款免费并且开源的现代化轻量级代码编辑器,支持语法高亮.智能代码补全.自定义热键.括号匹配.代码片段等特性,并针对网页开发做了优化. ...

  4. day02 Pyhton学习

    1.昨日内容回顾 1.python是一门解释型,弱类型的高级编程语言 优点: 1.优雅简单明确 2.短小快,代码短,代码量小,开发效率高 缺点: 1.运行效率低(相对) 2.python解释器 Cpy ...

  5. Lock、Synchronized锁区别解析

    上篇博文在讲解 ConcurrentHashMap 时说到 1.7 中 put 方法实现同步的方式是使用继承了 ReentrantLock 类的 segment 内部类调用 lock 方法实现的,而在 ...

  6. 三色二叉树 ---伪树形dp

    题目描述 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1S1 该树有一个子节点,S1为其二叉树序列 1S1S2 ...

  7. lumen发送邮件配置

    composer.json 增加 "illuminate/mail":"5.6"composer update -vvvconfig 目录新建mail.php ...

  8. 从Linux源码看Socket(TCP)的listen及连接队列

    从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...

  9. 简述 QPS、TPS、并发用户数、吞吐量关系

    1. QPS QPS Queries Per Second 是每秒查询率 ,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准, 即每秒的响应请求数,也即 ...

  10. poj2411 Mondriaan's Dream (轮廓线dp、状压dp)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17203   Accepted: 991 ...