Как подключить WebView2 статически в нативное С++ приложение, использующее CMake
Что такое WebView2, вы можете узнать здесь: https://learn.microsoft.com/ru-ru/microsoft-edge/webview2/
Компонент Microsoft.Web.WebView2 распространяется через репозиторий пакетов Nuget (https://www.nuget.org).
Как же подключить его к нативному C++ проекту, использующему CMake и собираемому с помощью Visual Studio?
Первый способ
Можно запускать команду nuget из CMakeLists.txt, устанавливать пакеты в какую-нибудь директорию и подключить файлы .targets.
find_program(NUGET_EXE NAMES nuget)
if(NOT NUGET_EXE)
message("NUGET.EXE not found.")
message(FATAL_ERROR "Please install this executable, and run CMake again.")
endif()
execute_process(COMMAND ${NUGET_EXE} install "Microsoft.Web.WebView2" -Version 1.0.2592.51 -ExcludeVersion -OutputDirectory ${CMAKE_BINARY_DIR}/packages)
execute_process(COMMAND ${NUGET_EXE} install "Microsoft.Windows.ImplementationLibrary" -Version 1.0.240122.1 -ExcludeVersion -OutputDirectory ${CMAKE_BINARY_DIR}/packages)
set_target_properties(app PROPERTIES VS_GLOBAL_WebView2LoaderPreference "Static")
target_link_libraries(app PUBLIC ${CMAKE_BINARY_DIR}/packages/Microsoft.Web.WebView2/build/native/Microsoft.Web.WebView2.targets)
target_link_libraries(app PUBLIC ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.ImplementationLibrary/build/native/Microsoft.Windows.ImplementationLibrary.targets)
Однако, как я не старался, подключалась динамическая библиотека. Можно, конечно, пойти дальше и прописывать пути к файлам .lib, учитывая целевую архитектуру, но нашёлся способ получше.
Второй способ
Нужно создать такой файл YourApp.props в корне проекта:
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ItemGroup Condition="'$(MSBuildProjectExtension)' == '.vcxproj'">
<ProjectCapability Include="PackageReferences" />
</ItemGroup>
<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.vcxproj'">
<NuGetTargetMoniker Condition="'$(NuGetTargetMoniker)' == ''">native,Version=v0.0</NuGetTargetMoniker>
<RuntimeIdentifiers Condition="'$(RuntimeIdentifiers)' == ''">win;win-x86;win-x64;win-arm;win-arm64</RuntimeIdentifiers>
</PropertyGroup>
</Project>
Этот файл позволит VS работать с PackageReference в проектах vcxproj.
И добавить эти строки в ваш CMakeLists.txt:
set_target_properties(app PROPERTIES VS_GLOBAL_WebView2LoaderPreference "Static")
set_target_properties(app PROPERTIES VS_USER_PROPS "${CMAKE_SOURCE_DIR}/YourApp.props")
set_target_properties(app PROPERTIES VS_PACKAGE_REFERENCES "Microsoft.Web.WebView2_1.0.2592.51;Microsoft.Windows.ImplementationLibrary_1.0.240122.1")
Проверено на CMake 3.29.5 и Microsoft Visual Studio Community 2019
Version 16.11.36