准备
- VS2019
- cef_binary_109.1.18+gf1c41e4+chromium-109.0.5414.120_windows64.zip
- cmake-3.19.8-win64-x64.zip
- doxygen-1.14.0.windows.x64.bin.zip(可选)
VS2019:代码开发、编译软件。
CEF:全称Chromium Embedded Framework,基于Google Chromium,并为第三方应用提供可嵌入浏览器支持。
这里选用的是支持Win7的最后一个版本,且是二进制的windows64位标准版。下载地址:https://cef-builds.spotifycdn.com/index.html
CMAKE:用于生成构建项目(生成VS解决方案以便编译),版本不要太新(不支持更旧的CEF),也不要太旧(不支持更新的VS)。下载地址:https://cmake.org/download/
DOXYGEN:接口文档生成软件,不是必需,为了不显示警告这里也就安装了(安装很简单,解压后将路径添加到系统的PATH环境变量即可)。下载地址:https://doxygen.cn/download.html
CEF说是二进制版,其实是个半成品,只是编译了CEF的核心部分(想要自己编译比较难,所以官方给出了预编译的二进制文件),里面还包含一个源码形式的接口封装项目libcef_dll_wrapper,其作用有以下几点:
接口封装:将 CEF 导出的 C API 转换为 C++ 接口,简化 C++ 应用程序对 CEF 功能的调用方式。
平台适配:包含与平台相关的封装代码,例如 GPU 优化和沙箱功能调用,使开发者无需直接操作底层细节即可实现功能。
连同libcef_dll_wrapper一起的还有使用示例的源码,这些也是跨平台的,所以需要CMAKE来生成特定平台的构建工程,然后自己编译。
接下来展示如何操作:
1.1、解压 cef_binary_109.1.18+gf1c41e4+chromium-109.0.5414.120_windows64.zip 与 cmake-3.19.8-win64-x64.zip
1.2、在CEF解压目录下新建build文件夹用于存放构建工程及构建过程中的中间文件。

1.3、运行cmake-gui.exe生成构建工程。(双击运行无需安装)





1.4、打开生成的构建工程(build/cef.sln)并编译(生成解决方案)即可。
需切换配置方案编译两次,以便生成Debug和Release两个版本的libcef_dll_wrapper.lib。

这里要注意:
同时只能有一个VS实例窗口运行,否则可能会编译出错;
libcef_dll_wrapper项目的C++语言标准默认为C++17,且使用静态编译,后面自己建工程时需与此一致:


下面展示如何从零建一个C++工程并集成CEF:
2.1、新建一个C++的空项目

2.2、在项目目录下建立如下文件夹结构,用来存放有用的CEF文件:

2.3、从前面的CEF库工程里搬运文件:

为了描述简便,下面以 “$CEF” 代替路径 “W:\C++\cef\cef_binary_109.1.18+gf1c41e4+chromium-109.0.5414.120_windows64”。
将 “$CEF” 下的 “include” 文件夹复制到 “Demo\Demo\cef” 下;
将 “$CEF\build\libcef_dll_wrapper\Debug” 下的 “libcef_dll_wrapper.lib” 文件复制到 “Demo\Demo\cef\lib\Debug” 下;
将 “$CEF\build\libcef_dll_wrapper\Release” 下的 “libcef_dll_wrapper.lib” 文件复制到 “Demo\Demo\cef\lib\Release” 下;
将 “$CEF\Debug” 下的 “libcef.lib”、“cef_sandbox.lib” 文件复制到 “Demo\Demo\cef\lib\Debug” 下;
将 “$CEF\Debug” 下除了 “libcef.lib”、“cef_sandbox.lib” 的所有文件复制到 “Demo\Demo\cef\run\Debug” 下;
将 “$CEF\Release” 下的 “libcef.lib”、“cef_sandbox.lib” 文件复制到 “Demo\Demo\cef\lib\Release” 下;
将 “$CEF\Release” 下除了 “libcef.lib”、“cef_sandbox.lib” 的所有文件复制到 “Demo\Demo\cef\run\Release” 下;
将 “$CEF\Resources” 下所有文件及文件夹同时复制到“Demo\Demo\cef\run\Debug” 和 “Demo\Demo\cef\run\Release” 下;
将 “$CEF\tests\cefsimple” 下的 “cefsimple_win.cc”、“simple_app.cc”、“simple_app.h”、“simple_handler.cc”、“simple_handler.h”、“simple_handler_win.cc” 文件复制到 “Demo\Demo” 下,并且将.cc扩展名改为.cpp;
至此所有文件搬运完成,完成后的工程目录结构如下:

其中,include与lib下的文件是编译需要,run文件夹下是程序运行需要。
2.4、项目设置
2.4.1、将 “cefsimple_win.cpp”、“simple_app.cpp”、“simple_app.h”、“simple_handler.cpp”、“simple_handler.h”、“simple_handler_win.cpp” 添加到项目


2.4.2、C++语言标准与静态编译(需与前面libcef_dll_wrapper项目一致,记得Debug与Release配置都改)


2.4.3、头文件查找路径

$(ProjectDir)cef,这里只能添加到cef这一层,不能是$(ProjectDir)cef\include,因为cef\include下的头文件都是通过#include "include/xx.h"方式来包含的。

2.4.4、库文件链接

$(ProjectDir)cef\lib\Debug\libcef.lib
$(ProjectDir)cef\lib\Debug\libcef_dll_wrapper.lib
$(ProjectDir)cef\lib\Debug\cef_sandbox.lib
$(ProjectDir)cef\lib\Release\libcef.lib
$(ProjectDir)cef\lib\Release\libcef_dll_wrapper.lib
$(ProjectDir)cef\lib\Release\cef_sandbox.lib
2.4.5、生成事件(将运行时需要的文件拷贝到输出目录)

xcopy /e /y /r $(ProjectDir)cef\run\$(ConfigurationName)\* $(TargetDir)
2.4.6、设置为窗口程序

2.4.7、修正头文件包含路径
#include "tests/cefsimple/xx.h" => #include "xx.h"
顺便修改下首页地址(simple_app.cpp 第105行)
url = "http://www.google.com"; => url = "https://www.baidu.com";
接下来可以着手编译了,毫不意外,结果出错了!
LNK2038 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(cefsimple_win.obj 中)
解决办法:

接下来编译过了,但是打开窗口是白的,exe同级目录下出现一个debug.log文件,里面提示
Check failed: fallback_available == base::win::GetVersion() > base::win::Version::WIN8 (1 vs. 0)
解决办法:
在工程目录中创建一个xx.manifest文件(xx是可以工程名字或者其他有意义的,这里取的是Demo.manifest),文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--The ID below indicates application support for Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!--The ID below indicates application support for Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!--The ID below indicates application support for Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>
在项目属性中添加这个manifest文件:

$(ProjectDir)Demo.manifest
到这里一个基本的、基于WEB排版桌面程序就完成了:

由于采用了静态链接运行时库,打包下图所示文件即可分发程序。

当然后续还有很多东西要处理,比如说:
添加HTTP文件服务器
控制窗口标题、大小、缩放、右键菜单等
JS与C++互访问
实现网络请求代理(虽然JS也能请求,但有跨域问题)
添加程序图标
生成程序安装包
2786

被折叠的 条评论
为什么被折叠?



