Как подключить 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


Комментарии
Оставьте ваш комментарий
Никнейм:
Никнейм*:
Пока никто не оставил ни одного комментария. Не хотите стать первыми?