CEF3专辑-基础篇-02-准备工作
2. 准备工作2.1. 选择 CEF SDK下载 CEF 框架:https://cef-builds.spotifycdn.com/index.html,由于Chromium 和 CEF 都更新得非常频繁,所以即使是当前稳定版本,也难免会有一些问题,如果遇到由于版本太新而导致的问题,可以点击下载页面左下角 Show All Builds 来选择历史版本。Debug Symbols 和 Release Symbols 是为调试崩溃报告服务的符号文件,我们暂时用不到这些文件,不用下载。Standard Distribution 相对于 Minimal Distribution 来说,多包含了调试文件和示例代码文件,我们这里选择 Standard Distribution。win10+VS2019推荐:cef_binary_109.1.8版本2.2. 编译运行 CEF 示例项目下载CMake软件:https://cmake.org/download/。CMake 工具内置了 cmake-gui 工具,我们使用这个工具来构建 CEF 的 VisualStudio 工程,在 Where is the source code 和 Where to build the binaries 设置好相应的目录,点击 Configure 按钮,配置工程,再点击 Generate 生成工程文件。Generate 完成后会在你配置的 build 目录下(Where to build the binaries)生成 Visual Studio 的工程文件:cef.sln。打开这个文件就启动 Visual Studio 并打开了我们刚刚配置的这个工程,或者点击 cmake-gui 工具中的 Open Project 按钮,也会打开这个工程。2.3. CEF 工程属性配置解读先打开项目的属性页面,这里属性窗口有一点需要注意,我们在配置选择框和平台选择框中选择 Debug 和 Release 或者 x64 和 Win32 ,都意味着不同的配置项。也就是说,我们为 Debug 环境做的配置是与 Release 环境的配置不同的,现在我们以 Debug+x64 环境为例介绍配置内容,配置以下几项内容即可。这里下载的是什么编译器的的就用什么编译器的。路径相关:
宏说明
$(Configuration)当前项目配置的名称,例如,“调试”。
$(DevEnvDir)Visual Studio 的安装目录(定义为驱动器 + 路径);包括尾随反斜杠“\”。
$(FrameworkDir)在其中安装了 .NET Framework 的目录。
$(FrameworkSDKDir)在其中安装了 .NET Framework 的目录。 .NET Framework 可能已作为 Visual Studio 的一部分安装或单独安装。
$(FrameworkVersion)Visual Studio 使用的.NET framework 版本。 结合 $(FrameworkDir),就是 Visual Studio 使用的 .NET Framework 版本的完整路径。
$(FxCopDir)fxcop.cmd 文件的路径。 fxcop.cmd 文件并未在所有 Visual Studio 版本中安装。
$(IntDir)为中间文件指定的目录路径。 如果这是一个相对路径,中间文件将转到已追加到项目目录的这一路径。 此路径应具有尾随斜杠。 它解析为“中间目录”属性的值。 请勿使用 $(OutDir) 来定义此属性。
$(OutDir)输出文件目录的路径。 如果这是一个相对路径,输出文件将转到已追加到项目目录中的这一路径。 此路径应具有尾随斜杠。 它解析为“输出目录”属性的值。 请勿使用 $(IntDir) 来定义此属性。
$(Platform)当前项目平台的名称(例如“Win32”)。
$(PlatformShortName)当前体系结构的短名称,例如“x86”或“x64”。
$(ProjectDir)项目的目录(定义为驱动器 + 路径);包括尾随反斜杠“\”。
$(ProjectExt)项目的文件扩展名。 文件扩展名之前包括“.”。
$(ProjectFileName)项目的文件名称(定义为基名称 + 文件扩展名)。
$(ProjectName)项目的基名称。
$(ProjectPath)项目的绝对路径名称(定义为驱动器 + 路径 + 基名称 + 文件扩展名)。
$(PublishDir)发布目标的输出位置;包括尾随反斜杠“\”。 默认为 $(OutDir)app.publish\ 文件夹。
$(RemoteMachine)设置为“调试”属性页上 Remote Machine 属性的值。 有关详细信息,请参阅更改 C/C++ 调试配置的项目设置。
$(RootNameSpace)包含应用程序的命名空间(如果存在)。
$(SolutionDir)解决方案的目录(定义为驱动器 + 路径);包括尾随反斜杠“\”。 仅当在 IDE 中生成解决方案时定义。
$(SolutionExt)解决方案的文件扩展名。 文件扩展名之前包括“.”。 仅当在 IDE 中生成解决方案时定义。
$(SolutionFileName)解决方案的文件名称(定义为基名称 + 文件扩展名)。 仅当在 IDE 中生成解决方案时定义。
$(SolutionName)解决方案的基名称。 仅当在 IDE 中生成解决方案时定义。
$(SolutionPath)解决方案的绝对路径名称(定义为驱动器 + 路径 + 基名称 + 文件扩展名)。 仅当在 IDE 中生成解决方案时定义。
$(TargetDir)生成的主输出文件的目录(定义为驱动器 + 路径);包括尾随反斜杠 “\”。
$(TargetExt)生成的主输出文件的文件扩展名。 文件扩展名之前包括“.”。
$(TargetFileName)生成的主输出文件的文件名称(定义为基名称 + 文件扩展名)。
$(TargetName)生成的主输出文件的基名称。
$(TargetPath)生成的主输出文件的绝对路径名称(定义为驱动器 + 路径 + 基名称 + 文件扩展名)。
$(VCInstallDir)包含 Visual Studio 安装的 C++ 内容的目录。 此属性包含目标 Microsoft C++ (MSVC) 工具集的版本,它可能与主机 Visual Studio 不同。 例如,当使用 $(PlatformToolset) = v140 进行生成时,$(VCInstallDir) 包含 Visual Studio 2015 安装路径。
$(VSInstallDir)在其中安装了 Visual Studio 的目录。 此属性包含目标 Visual Studio 工具集的版本,它可能与主机 Visual Studio 不同。 例如,当使用 $(PlatformToolset) = v110 进行生成时,$(VSInstallDir) 包含 Visual Studio 2012 安装路径。
$(WebDeployPath)从 Web 部署根到项目输出位置的相对路径。
$(WebDeployRoot)<localhost> 位置的绝对路径。 例如,c:\inetpub\wwwroot。
2.3.1. 常规1.常规->输出目录:目标文件所在的文件目录;2.常规->中间目录:生成目标文件所生成的中间文件所在的文件路径;3.常规->目标文件名:生成目标文件的文件名;4.常规->配置类型:有:应用程序(.exe);动态库(.dll);静态库(.lib);5.常规->平台工具集:VS的编译器版本,一般从VC6.0到当前最新的VS2019,对应的是V60-V142;不同VS版本编译出来的项目使用的平台工具集不同;如果你安装的VS不支持之前的项目,就需要安装Daffodil.ENU.msi或者对应的开发环境;6.常规->C++ 语言标准”设置为:ISO C++17 标准 ( /std:c++ 17 ),这个配置可以使我们在工程中使用现代 C++ 的语言特性。2.3.2. 高级7.高级->MFC的使用:使用标准Windows库:使用默认Windows提供的基本库;在静态库中使用 MFC:使用window提供的静态库;对应了C++生成方式为:MT/MTd;在共享 DLL 中使用 MFC:使用window提供的动态库;对应C++生成方式为:MD/MDd;8.高级->字符集:使用 Unicode 字符集:代码中使用Unicode编码;使用多字节字符集:代码中使用多字符编码;一般情况下,程序都是用的是多字符字符9.高级->全程序优化:基本上不会修改,默认无全程序优化即可;2.3.3. 调试10.调试->命令:包含可执行文件的全路径,比如当前项目生成动态库dll,那么使用这个dll的exe的路径为:C:\Code\TestVTK\Debug\TestVTK.exe;11.调试->命令参数:在运行可执行文件时,附加的命令参数,一般是控制台程序,在其后附加命令参数为main函数的char *argv;12.调试->工作目录:在“命令”配置项中,去掉可执行文件的文件名就是工作目录,也就是可执行文件所在目录;2.3.4. VC++目录13.VC++目录->包含目录:用于搜索使用第三方库的include文件夹;14.VC++目录->库目录:用于搜索使用第三方库的lib文件夹;2.3.5. C/C++15.C/C++->常规->附加包含目录:功能同“包含目录”,用于放置使用第三方库的头文件目录,或者放当前解决方案目录或项目目录,这样在代码中可以避免使用相对路径来对应头文件;设置为: E:\project\cef; ,这个路径是你下载的 CEF 框架所在的路径。注意:在使用 CEF 框架前你必须已经成功编译了 CEF 的示例项目。16.C/C++->常规->警告等级:可以选择编译器对代码错误的严格程度;17.C/C++->常规->将警告视为错误:将所有编译器警告都视作错误;18.C/C++->优化->优化:在Debug模式和Release模式下,不同设置;Debug下使用“已禁用”;Release模式下使用“最大优化(优选速度) (/O2)”;19.C/C++->预处理器->预处理器定义:用于控制代码中的宏判断,就可以使用增加预处理器,控制代码中的开启,此处定义为如下内容:%(PreprocessorDefinitions)WIN32_WINDOWS__STDC_CONSTANT_MACROS__STDC_FORMAT_MACROS_WIN32UNICODE_UNICODEWINVER=0x0601_WIN32_WINNT=0x601NOMINMAXWIN32_LEAN_AND_MEAN_HAS_EXCEPTIONS=0PSAPI_VERSION=1CEF_USE_SANDBOXCEF_USE_ATL_HAS_ITERATOR_DEBUGGING=0CMAKE_INTDIR="Debug"这些预处理器定义大部分都是 Windows 平台和 CEF 框架要求的预处理器定义,最后一项是为了屏蔽 CEF 框架中低版本 C++ 警告的预处理器。20.C/C++ ->代码生成->启用C++异常:如果想要捕获C语言异常,需要使用”是,但有 SEH 异常 (/EHa)“;21.C/C++ ->代码生成->运行库:与MFC的使用配合使用,参照MFC的使用的说明;MT是静态编译,将项目使用的库链接到生成文件中,不需要使用外部提供的dll;MD是动态编译,在使用目标文件,需要额外提供dll等依赖文件;设置为:多线程调试 (/ MTd ),这是为了适配 Chromium 的调试方式而设置的。22.C/C++ ->代码生成->结构成员对齐:结构体或类成员的对齐方式,如果写dll或lib,就需要和调用的exe的对齐方式保持一致,这样才能正确解析结构体内容;23.C/C++ ->预编译头->预编译头:可以选择"使用 (/Yu)";“创建 (/Yc)”;“不使用预编译头”;使用预编译头可以快速编译程序;不过在CEF第三方的库中一般不适用预编译头;24.C/C++ ->预编译头->预编译头文件:要预编译的头文件名;25.C/C++->高级->禁用特定警告:4100412742444324448145124701470249962.3.6. 清单工具清单工具->输入和输出->附加清单文件:xxxx.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 8.1 --><supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 10.0 --><supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/></application></compatibility></assembly>2.3.7. 链接器26.链接器->常规->输出文件:同输出目录+输出文件名;27.链接器->常规->附加库目录:同库目标,是搜索依赖lib的文件夹路径;28.链接器->输入->附加依赖项”设置为如下内容:D:\repos\cef\Debug\libcef.libD:\repos\cef\build\libcef_dll_wrapper\Debug\libcef_dll_wrapper.libD:\repos\cef\Debug\cef_sandbox.libcomctl32.libgdi32.librpcrt4.libshlwapi.libws2_32.libAdvapi32.libdbghelp.libDelayimp.libOleAut32.libPowrProf.libPropsys.libpsapi.libSetupAPI.libShell32.libversion.libwbemuuid.libwinmm.libkernel32.libuser32.libwinspool.libshell32.libole32.liboleaut32.libuuid.libcomdlg32.libadvapi32.lib这是在编译、链接我们的程序时,使用 CEF 和 Windows 库的配置,其中 ..\cef 是你下载的 CEF 框架所在的路径。29.链接器->系统->子系统”设置为:窗口 ( /SUBSYSTEM:WINDOWS ),VisualStudio 创建空白项目时,默认是控制台项目,这里我们把它调整为窗口项目。2.3.8. 生成事件30.生成事件->生成后事件->命令行:这里把.manifest文件输入到exe,并且把exe依赖的文件拷贝到对应exe目录里。setlocalmt.exe -nologo -manifest "D:/repos/cef/tests/cefsimple/cefsimple.exe.manifest" "D:/repos/cef/tests/cefsimple/compatibility.manifest" -outputresource:"D:/repos/cef/build/tests/cefsimple/Debug/cefsimple.exe";#1if %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Debug/chrome_elf.dll D:/repos/cef/build/tests/cefsimple/Debug/chrome_elf.dllif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Debug/libcef.dll D:/repos/cef/build/tests/cefsimple/Debug/libcef.dllif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Debug/libEGL.dll D:/repos/cef/build/tests/cefsimple/Debug/libEGL.dllif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Debug/libGLESv2.dll D:/repos/cef/build/tests/cefsimple/Debug/libGLESv2.dllif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Debug/snapshot_blob.bin D:/repos/cef/build/tests/cefsimple/Debug/snapshot_blob.binif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Debug/v8_context_snapshot.bin D:/repos/cef/build/tests/cefsimple/Debug/v8_context_snapshot.binif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Debug/vk_swiftshader.dll D:/repos/cef/build/tests/cefsimple/Debug/vk_swiftshader.dllif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Debug/vk_swiftshader_icd.json D:/repos/cef/build/tests/cefsimple/Debug/vk_swiftshader_icd.jsonif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Debug/vulkan-1.dll D:/repos/cef/build/tests/cefsimple/Debug/vulkan-1.dllif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Debug/d3dcompiler_47.dll D:/repos/cef/build/tests/cefsimple/Debug/d3dcompiler_47.dllif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Resources/chrome_100_percent.pak D:/repos/cef/build/tests/cefsimple/Debug/chrome_100_percent.pakif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Resources/chrome_200_percent.pak D:/repos/cef/build/tests/cefsimple/Debug/chrome_200_percent.pakif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Resources/resources.pak D:/repos/cef/build/tests/cefsimple/Debug/resources.pakif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_if_different D:/repos/cef/Resources/icudtl.dat D:/repos/cef/build/tests/cefsimple/Debug/icudtl.datif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEndsetlocalD:\repos\cmake\bin\cmake.exe -E copy_directory D:/repos/cef/Resources/locales D:/repos/cef/build/tests/cefsimple/Debug/localesif %errorlevel% neq 0 goto :cmEnd:cmEndendlocal & call :cmErrorLevel %errorlevel% & goto :cmDone:cmErrorLevelexit /b %1:cmDoneif %errorlevel% neq 0 goto :VCEnd2.4. VS组成代码相关ALL_BUILD:CMake相关cef_gtest:cef面向google test测试框架的单元测试项目。cefclient:cef的客户端事例,非常全面。是学习深造cef的必经之路。cefsimple:cef的一个客户端简单事例。学习cef最简单的开始入口。ceftests:cef的单元测试项目。libcef_dll_wrapper:cef的静态库引用,是c++的版本的导出。默认cef的libcef是c的。ZERO_CHECK:CMake相关2.5. 程序组件相关2.5.1. 无用组件:cefclient.exp cefclient.lib cefclient.ilk cefclient.pdb 可删除2.5.2. 必要组件:libcef.dll :CEF核心库。chrome_elf.dll:崩溃报告库。icudtl.dat Unicode支持数据。natives_blob.bin V8快照数据。snapshot_blob.bin V8快照数据。2.5.3. 可选组件:以下组件是可选的。如果他们缺少CEF将继续运行但任何相关的功能可能会被破坏或禁用。去掉某些可选组件需要用命令行参数关闭相关功能。● 本地化资源。区域文件加载可以完全禁用CefSettings.pack_loading_disabled。locales目录路径可以是使用CefSettings.locales_dir_path进行自定义。● 语言环境包含CEF,Chromium和Blink使用的本地化资源的目录。一个 .pak文件是基于CefSettings.locale从此目录加载的值。只有配置的语言环境需要分发。如果没有区域设置配置将使用“en-US”的默认语言环境。没有这些文件任意Web组件可能显示不正确。● 其他资源。包文件加载可以完全禁用 CefSettings.pack_loading_disabled。资源目录路径可以是使用CefSettings.resources_dir_path进行自定义。以下这些文件包含CEF,Chromium和Blink使用的非本地化资源。没有这些文件,任何Web组件可能会显示不正确。cef.pakcef_100_percent.pakcef_200_percent.pak该文件包含扩展加载所需的非本地化资源。传递`--disable-extensions`命令行标志来禁止使用这个标志文件。如果没有这个依赖于扩展系统的文件组件,如PDF查看器将无法正常工作。cef_extensions.pak此文件包含Chrome Developer所需的非本地化资源工具。没有这个文件,Chrome开发者工具将无法运行。devtools_resources.pak● 角度和Direct3D支持。没有这些文件,HTML5加速内容,如2D画布,3D CSS和WebGL将不起作用。d3dcompiler_43.dll(Windows XP需要)d3dcompiler_47.dll(Windows Vista及更新版本需要)libEGL.dlllibGLESv2.dllWidevine CDM支持。如果没有此文件播放Widevine投影内容将不起作用。widevinecdmadapter.dll
页:
[1]