本文主要记录windows平台搭建cef开发环境的过程。
前置条件
- Windows 操作系统
- vs studio / vscode
- cmake
CEF 源码下载
通过github 的cef找到下载预编译好的cef链接:https://cef-builds.spotifycdn.com/index.html
找到对应的操作系统及cpu架构的tab页, 笔者选择的是Windows 64-bit
, 然后在Current Stable Build > Standard Distribution
下载对应的压缩包。
这个包预编译了大部分所需库,分别在Debug/Release目录中, 包括:
- libcef.dll
- cef_sandbox.lib
- ...
还包含编译libcef_dll_wrapper所需的源码及sample
libcef_dll_wrapper 编译
打开cmake-gui, 选择源码目录, 选择生成目录。 configure > generate > open project
然后编译。
开发环境配置
接下来描述的开发环境配置仅适用于cmake项目
-
将预编译好的库复制出来, 包括目录为
- Debug
- Release
- cef_sandbox.lib
- chrome_elf.dll
- d3dcompiler_47.dll
- dxcompiler.dll
- dxil.dll
- libcef.dll
- libcef.lib
- libcef_dll_wrapper.lib
- libcef_dll_wrapper.pdb
- libEGL.dll
- libGLESv2.dll
- snapshot_blob.bin
- v8_context_snapshot.bin
- vk_swiftshader.dll
- vk_swiftshader_icd.json
- vulkan-1.dll
- Resources
-
将cmake、include目录复制出来, cmake目录包含如下文件:
- cef_macros.cmake
- cef_variables.cmake
- FindCEF.cmake
-
在cmake目录中新增
cef_dll_wrapper.cmake
文件:set(CEF_CEFWRAPPER_LIB_DEBUG "${CEF_BINARY_DIR_DEBUG}/libcef_dll_wrapper.lib") set(CEF_CEFWRAPPER_LIB_RELEASE "${CEF_BINARY_DIR_RELEASE}/libcef_dll_wrapper.lib") ADD_LOGICAL_TARGET("libcef_dll_wrapper" "${CEF_CEFWRAPPER_LIB_DEBUG}" "${CEF_CEFWRAPPER_LIB_RELEASE}") ADD_LOGICAL_TARGET("libcef_lib" "${CEF_LIB_DEBUG}" "${CEF_LIB_RELEASE}") if(USE_SANDBOX) # Logical target used to link the cef_sandbox library. ADD_LOGICAL_TARGET("cef_sandbox_lib" "${CEF_SANDBOX_LIB_DEBUG}" "${CEF_SANDBOX_LIB_RELEASE}") endif()
ADD_LOGICAL_TARGET定义在
cef_macros.cmake
中, 主要用于添加一个imported项目。
USE_SANDBOX定义在cef_variables.cmake
中, 主要确定是否开启沙箱,如果开启, 将会激活CEF_USE_SANDBOX
宏定义,此宏直接影响示例代码中关于沙箱的设置。USE_SANDBOX同时会影响与沙箱相关的library。 -
修改
FindCEF.cmake
, 在文件前头添加get_filename_component(CEF_ROOT ${CMAKE_CURRENT_LIST_DIR} DIRECTORY)
用于动态确定环境位置。在末尾添加include("cef_dll_wrapper")
用于包含cef_dll_wrapper相关环境 -
完成
项目配置示例
find_package(CEF MODULE REQUIRED)
add_executable (mytarget WIN32 ${SOURCEFILES})
set(CEF_TARGET_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}")
SET_EXECUTABLE_TARGET_PROPERTIES(mytarget)
target_compile_definitions(mytarget PRIVATE UNICODE _UNICODE _WINDOWS)
target_link_options(mytarget PRIVATE
/ENTRY:wWinMainCRTStartup
)
target_link_libraries(mytarget libcef_lib libcef_dll_wrapper ${CEF_STANDARD_LIBS} ${CEF_SANDBOX_STANDARD_LIBS})
if (CMAKE_VERSION VERSION_GREATER 3.12)
set_property(TARGET mytarget PROPERTY CXX_STANDARD 20)
endif()
if(USE_SANDBOX)
# Logical target used to link the cef_sandbox library.
target_link_libraries(mytarget cef_sandbox_lib )
endif()
# Add the custom manifest files to the executable.
ADD_WINDOWS_MANIFEST("${CMAKE_CURRENT_SOURCE_DIR}/winres" "mytarget" "exe")
# Copy binary and resource files to the target output directory.
COPY_FILES("mytarget" "${CEF_BINARY_FILES}" "${CEF_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}")
COPY_FILES("mytarget" "${CEF_RESOURCE_FILES}" "${CEF_RESOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}")
关键配置
-
find_package(CEF MODULE REQUIRED)
-
set(CEF_TARGET_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}")
这个设置主要是因为
ADD_WINDOWS_MANIFEST
这个宏中用到了CEF_TARGET_OUT_DIR
-
SET_EXECUTABLE_TARGET_PROPERTIES(mytarget) 主要用于设置必要的编译链接选项
-
必要依赖的环境libcef_lib libcef_dll_wrapper ${CEF_STANDARD_LIBS} ${CEF_SANDBOX_STANDARD_LIBS}, 之所以需要CEF_SANDBOX_STANDARD_LIBS,是因为这个宏定义了Windows必要的依赖库, 特别是
Delayimp.lib
。 否则报链接错误。 -
其他没啥可提的了, COPY_FILES是必要的,方便调试运行。