Поделиться через


vcpkg в проектах MSBuild

Методы интеграции

Интеграция на уровне пользователя

Чтобы использовать vcpkg в проектах MSBuild, выполните следующую команду:

vcpkg integrate install

Вам нужно выполнить только команду vcpkg integrate install при первом включении интеграции MSBuild. Это позволяет интегрировать MSBuild для всех существующих и будущих проектов.

Если у вас есть несколько экземпляров vcpkg, можно использовать команду vcpkg integrate install, чтобы обновить, какой экземпляр vcpkg используется в MSBuild. Используйте vcpkg integrate remove, чтобы удалить интеграцию MSBuild на уровне пользователя.

Этот метод интеграции автоматически добавляет пакеты, установленные vcpkg, в следующие свойства проекта: включить каталоги, каталоги ссылок и библиотеки ссылок. Кроме того, это создает действие после сборки, которое гарантирует, что все необходимые библиотеки DLL копируются в выходную папку сборки. Это работает для всех решений и проектов с помощью Visual Studio 2015 или более поздней версии.

Это все, что вам нужно сделать для подавляющего большинства библиотек. Однако некоторые библиотеки выполняют конфликтующие действия, такие как переопределение main(). Поскольку нужно выбрать для каждого проекта, какие из этих конфликтующих опций вы хотите использовать, необходимо вручную добавить эти библиотеки в входные файлы компоновщика.

Ниже приведены некоторые примеры, в которых требуется связывание вручную (не исчерпывающий список):

  • Gtest предоставляет gtest, gmockgtest_mainиgmock_main
  • SDL2 предоставляет SDL2main
  • SFML предоставляет sfml-main
  • Boost.Test предоставляет boost_test_exec_monitor

Чтобы получить полный список для всех установленных пакетов, выполните команду vcpkg owns manual-link.

Импорт .props и .targets

vcpkg также можно интегрировать в проекты MSBuild, явно импортируя scripts/buildsystems/vcpkg.props и scripts/buildsystems/vcpkg.targets файлы в каждый .vcxproj. Благодаря использованию относительных путей, это позволяет vcpkg использоваться подмодулем и автоматически приобретаться пользователями при выполнении git clone.

Самый простой способ добавить их в каждый проект в решении — создать Directory.Build.props и Directory.Build.targets файлы в корне репозитория.

В следующих примерах предполагается, что они находятся в корне репозитория с подмодулой microsoft/vcpkg at vcpkg.

Пример: Directory.Build.props.

<Project>
 <Import Project="$(MSBuildThisFileDirectory)vcpkg\scripts\buildsystems\msbuild\vcpkg.props" />
</Project>

Пример: Directory.Build.targets.

<Project>
 <Import Project="$(MSBuildThisFileDirectory)vcpkg\scripts\buildsystems\msbuild\vcpkg.targets" />
</Project>

См. раздел «Настройка сборки» официальной документации MSBuild для получения дополнительной информации о Directory.Build.targets и Directory.Build.props.

Передача свойств MSBuild в триплеты и портфайлы

Значение свойств MSBuild можно передать в сборки vcpkg в качестве переменных среды с помощью SetEnv задачи. Перед задачей VcpkgTripletSelection необходимо задать эти переменные среды.

В следующем примере показано, как проект MSBuild передает значение свойства MyProp в vcpkg в качестве переменной среды, чтобы сделать его пригодным для использования внутри триплетов и портфайлов.

Пример: Directory.Build.props.

<Project>
  <PropertyGroup>
    <VcpkgRoot>C:\dev\vcpkg\</VcpkgRoot>
    <MyProp Condition="'$(Platform)' == 'x64'">X64_VALUE</MyProp>
    <MyProp Condition="'$(Platform)' == 'x86'">X86_VALUE</MyProp>
  </PropertyGroup>
 <Import Project="$(VcpkgRoot)scripts\buildsystems\msbuild\vcpkg.props" />
</Project>

Пример: Directory.Build.targets.

<Project>
  <Import Project="$(VcpkgRoot)scripts\buildsystems\msbuild\vcpkg.targets" />
  <Target Name="_SetVcpkgEnvVars" BeforeTargets="VcpkgTripletSelection">
    <Message Text="Setting MY_PROP to $(MyProp)" />
    <SetEnv Name="MY_PROP" Value="$(MyProp)" Prefix="false" />
  </Target>
</Project>

Пример триплета x64-windows-custom.cmake

set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE dynamic)

# Pass the environment variable to port builds
set(VCPKG_ENV_PASSTHROUGH_UNTRACKED MY_PROP)

Пример portfile.cmake

set(VCPKG_POLICY_EMPTY_PACKAGE enabled)

MESSAGE(STATUS "MY_PROP is $ENV{MY_PROP}")

Линкованный пакет NuGet

Замечание

Этот подход не рекомендуется для новых проектов, так как это затрудняет их совместное использование с другими пользователями. Переносимый автономный пакет NuGet см. в разделе export command.

Проекты VS также можно интегрировать с помощью пакета NuGet. Это приведет к изменению файла проекта, поэтому мы не рекомендуем использовать этот подход для проектов с открытым кодом.

PS D:\src\vcpkg> .\vcpkg integrate project
Created nupkg: D:\src\vcpkg\scripts\buildsystems\vcpkg.D.src.vcpkg.1.0.0.nupkg

With a project open, go to Tools->NuGet Package Manager->Package Manager Console and paste:
    Install-Package vcpkg.D.src.vcpkg -Source "D:/src/vcpkg/scripts/buildsystems"

Замечание

Созданный пакет NuGet не содержит фактические библиотеки. Вместо этого он действует как ярлык (или символическая ссылка) к каталогу установки vcpkg и будет "автоматически" обновляться с любыми изменениями (установкой или удалением) в библиотеках. Вам не нужно повторно создавать или обновлять пакет NuGet.

Общая конфигурация

VcpkgEnabled (Использование Vcpkg)

Для этого можно задать значение false, чтобы явно отключить интеграцию vcpkg для проекта.

VcpkgConfiguration (Конфигурация Vcpkg)

Если имена конфигурации слишком сложны, чтобы vcpkg правильно их угадал, вы можете назначить это свойство как Release или Debug, чтобы явно указать vcpkg, какой вариант библиотек вы хотите выбрать.

VcpkgEnableManifest (Использование манифеста Vcpkg)

Это свойство должно быть установлено в true, чтобы использовать локальный файл vcpkg.json. Если задано значение false, все локальные vcpkg.json файлы будут игнорироваться.

В настоящее время используется false по умолчанию, но в будущем по умолчанию будет использоваться true.

VcpkgTriplet (Триплет)

Это свойство управляет набором параметров для использования библиотек, таких как x64-windows-static или arm64-windows.

Если это не задано явным образом, vcpkg выведет правильный триплет на основе параметров Visual Studio. vcpkg будет выводить только триплеты, использующие динамическую компоновку библиотек и динамическую компоновку CRT; если требуются статические зависимости или использовать статическую компоновку CRT (/MT), необходимо вручную задать триплет.

Вы можете увидеть автоматически определенный триплет, установив уровень подробности MSBuild на "обычный" или более высокий.

Сочетание клавиш: CTRL+Q "сборка и запуск"

Инструменты -> Параметры -> Проекты и решения -> Сборка и запуск -> Подробности вывода сборки проекта MSBuild

См. также триплеты

VcpkgHostTriplet (Триплет хоста)

Для разрешения зависимостей хостов можно задать настраиваемый триплет.

Если этот параметр не задан, по умолчанию используется триплет "native" (x64-windows).

См. также зависимости хоста.

VcpkgInstalledDir (установленный каталог)

Это свойство определяет расположение vcpkg для установки и использования библиотек.

В режиме манифеста это значение по умолчанию — $(VcpkgManifestRoot)\vcpkg_installed\$(VcpkgTriplet)\. В классическом режиме это значение по умолчанию $(VcpkgRoot)\installed\.

VcpkgApplocalDeps (Локальное развертывание библиотек DLL приложений)

Это свойство включает или отключает обнаружение и копирование зависимых DLL из установленной структуры vcpkg в выходной каталог проекта.

VcpkgXUseBuiltInApplocalDeps (Используйте встроенное локальное развертывание приложений)

Это свойство, если оно включено, использует экспериментальную встроенную реализацию развертывания DLL в локальном приложении vcpkg при развертывании DLL в местном контексте приложения. Это свойство будет удалено и не действует, когда встроенная реализация больше не является экспериментальной.

Это свойство не оказывает эффекта, если значение $(VcpkgApplocalDeps) равно false.

Конфигурация режима манифестации

Чтобы использовать манифесты (vcpkg.json) с MSBuild, сначала необходимо использовать один из описанных выше методов интеграции. Затем добавьте vcpkg.json над файлом проекта (например, в корневом каталоге исходного репозитория) и задайте для свойства VcpkgEnableManifest значение true. Это свойство можно задать с помощью интегрированной среды разработки в свойствах> проектаVcpkg>Использовать манифест Vcpkg. Чтобы просмотреть страницу свойств vcpkg, может потребоваться перезагрузить интегрированную среду разработки.

vcpkg будет запускаться в ходе сборки вашего проекта и устанавливать все перечисленные зависимости в vcpkg_installed/$(VcpkgTriplet)/ рядом с файлом vcpkg.json; эти библиотеки затем будут автоматически включены и связаны с вашими проектами MSBuild.

Известные проблемы

  • Visual Studio 2015 неправильно отслеживает изменения в файлах vcpkg.json и vcpkg-configuration.json и не будет реагировать на изменения, если не будут изменены .cpp.

VcpkgAdditionalInstallOptions (Дополнительные параметры)

При использовании манифеста этот параметр задает дополнительные флаги командной строки для передачи в вызов базового средства vcpkg. Это можно использовать для доступа к функциям, которые еще не были предоставлены с помощью другого варианта.

VcpkgManifestInstall (Установка зависимостей Vcpkg)

Это свойство можно установить в false, чтобы отключить автоматическое восстановление зависимостей во время сборки проекта. Зависимости должны быть восстановлены вручную с помощью командной строки vcpkg отдельно.