cef编译及使用-Windows上编译cef

2017/02/17 program 共 4235 字,约 13 分钟

可以从以下站点下载cef源码:

使用CEF的DUILB开源项目参考: karllen/cef3-duilib-YDDemo: cef3+duilib开源仿有道词典

Google Code上倒是可以下载,但是是老的版本,2012年的: Google Code chromiumembedded

但是好处是有vs2005、vs2008、vs2010版本的sln,不需要使用CMake转换。

nmake编译(推荐)

2023年3月29日补充。受益于GPT4,有了更加简便高效的编译方法,也就是把CMakeLists.txt转换成Makefile再用nmake编译。详细参考:CMake、CMakeLists.txt、GCC、Clang、LLVM、MinGW、交叉编译

  1. 确保已经安装了CMake。如果没有安装,可以从官方网站下载CMake并安装。

  2. CMakeLists.txt里面找到PRINT_CEF_CONFIG(),在其前面添加如下代码:

    if(MSVC)
        if(CMAKE_BUILD_TYPE STREQUAL "Debug")
            set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
    		add_definitions(/D_ITERATOR_DEBUG_LEVEL=2)
            target_compile_definitions(libcef_dll_wrapper PRIVATE _HAS_ITERATOR_DEBUGGING=1)
            target_compile_definitions(libcef_dll_wrapper PRIVATE _ITERATOR_DEBUG_LEVEL=2)
            message(STATUS "Setting _ITERATOR_DEBUG_LEVEL to 2 for Debug build")
        else()
            set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
    		add_definitions(/D_ITERATOR_DEBUG_LEVEL=0)
            target_compile_definitions(libcef_dll_wrapper PRIVATE _HAS_ITERATOR_DEBUGGING=0)
            target_compile_definitions(libcef_dll_wrapper PRIVATE _ITERATOR_DEBUG_LEVEL=0)
            message(STATUS "Setting _ITERATOR_DEBUG_LEVEL to 0 for Debug build")
        endif()
    endif()
       
       
    # Display configuration settings.
    PRINT_CEF_CONFIG()
    
  3. 使用如下的命令转换:

    cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug   -D_HAS_ITERATOR_DEBUGGING=1 -D_ITERATOR_DEBUG_LEVEL=2
    cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release
    
  4. 使用nmake编译。

对于cef来说,只需要把编译出来的libcef_dll_wrapper.lib拿来使用即可,其他文件直接包里的即可。

VisualStudio2017、2019编译

VisualStudio2017、2019编译非常快速,使用CMake对cef_binary_3.3578.1860.g36610bd_windows32创建build项目,创建成功后只编译libcef_dll_wrapper即可,其他lib和资源使用编译好的即可。

2021年3月3日,以下载 cef_binary_88.2.9+g5c8711a+chromium-88.0.4324.182_windows32_minimal 为例,使用CMake-gui转换,默认是64位版本(如果需要使用32位版本,转换的时候注意选择Win32),转换后的vs工程默认就是Unicode字符集MTd(MT)的,直接编译libcef_dll_wrapper即可,生成的lib拷走,其他的lib直接使用现成的。

如何使用

必须文件

经测试主程序目录下须携带以下文件:

libcef.dll
chrome_elf.dll
icudtl.dat
v8_context_snapshot.bin
cef.pak
cef_extensions.pak
cef_200_percent.pak
cef_100_percent.pak

如果主程序运行仍然出错,可能就是资源文件没有配齐,可以再复制一些cef的资源文件进去试试。

注意

  • 尽量链接release版本的,要链接:libcef.lib、cef_sandbox.lib、libcef_dll_wrapper
  • 字符串要传递的时候,需转换为Unicode,可使用std::wstring转换,注意使用CStringW转换可能会有问题。
  • VisitDOM只能在render进程中使用,无法在browser进程中使用。

cef的通信及同步调用JS

常见问题

  • cefinitialize崩溃:说明exe执行路径下缺少相关文件导致初始化失败,可以把Resources目录下的locales文件夹、icudtl.dat、cef*.pak等文件复制过来。
  • base::Bind not found:解决办法:修改为base::BindOnce,会提示找不到OnceCallback,需要在cef_bind.h头文件中添加对cef_callback.h文件的包含,这个太坑了。

老版本VisualStudio编译(不推荐,系较早时期研究cef的记录)

CEF Automated Builds下载Windows 32-bit Builds,找到Minimal Distribution或Standard Distribution(版本里面有CMakeLists.txt才能用CMake转换)下载。

vs2008能编译的较新的版本 11/19/2016 - CEF 3.2840.1518.gffd843c / Chromium 54.0.2840.99,往后的不能编译,可能需要vs2015.

一个可用的稳定版本:10/12/2016 - CEF 3.2785.1485.g2b5c3a7 / Chromium 53.0.2785.116,但是网页乱码 解析不完全。

CMake转换的时候会出错:

Error in configuration process, project files may be invalid

可以看看输出的错误信息是:

CMake Error at CMakeLists.txt:202 (add_subdirectory):
  The source directory

    F:/opensource/cef_binary_3.3163.1669.ge260cbb_windows32_minimal/tests/cefclient

  does not contain a CMakeLists.txt file.


CMake Error at CMakeLists.txt:203 (add_subdirectory):
  add_subdirectory given source "tests/cefsimple" which is not an existing
  directory.


CMake Error at CMakeLists.txt:204 (add_subdirectory):
  add_subdirectory given source "tests/gtest" which is not an existing
  directory.


CMake Error at CMakeLists.txt:205 (add_subdirectory):
  add_subdirectory given source "tests/ceftests" which is not an existing
  directory.

就是几个测试用的工程不存在,我们不需要这些,直接打开CMakeLists.txt进行修改找到:

add_subdirectory(tests/cefclient)
add_subdirectory(tests/cefsimple)
add_subdirectory(tests/gtest)
add_subdirectory(tests/ceftests)

注释掉,改为:

# add_subdirectory(tests/cefclient)
# add_subdirectory(tests/cefsimple)
# add_subdirectory(tests/gtest)
# add_subdirectory(tests/ceftests)

保存后重新用CMake转换一次即可生成vs项目,vs2008的也完全没问题,轻便。

打开VS->项目->属性->配置属性->C/C++->常规->将警告视为错误修改为“否”,字节编码改为多字节

参考

文档信息

Search

    Table of Contents