Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
vcpkg имеет два режима работы: классический режим и режим манифеста. В этой статье описывается, как установить пакеты с помощью режима манифеста, который является рекомендуемым рабочим процессом для большинства пользователей.
В режиме манифеста вы объявляете прямые зависимости проекта в файле манифеста с именем vcpkg.json.
Файлы манифеста имеют собственный каталог vcpkg_installed, где они устанавливают зависимости, в отличие от классического режима, где все пакеты устанавливаются в общий каталог %VCPKG_ROOT%/installed. Поэтому каждый проект может иметь собственный манифест и собственный набор зависимостей, которые не конфликтуют с зависимостями других проектов.
Режим манифеста также необходим для использования расширенных функций, таких как управление версиями и пользовательских реестров.
В этом руководстве вы узнаете, как:
Необходимые условия
- vcpkg
- Терминал
- Редактор кода
- Компилятор C++
- (Необязательно) CMake или MSBuild
Создание проекта C++
В новой папке создайте исходный файл с именем main.cxx с этим содержимым:
main.cxx
#include <cxxopts.hpp>
#include <fmt/format.h>
#include <range/v3/view.hpp>
namespace view = ranges::views;
int fib(int x)
{
int a = 0, b = 1;
for (int it : view::repeat(0) | view::take(x))
{
(void)it;
int tmp = a;
a += b;
b = tmp;
}
return a;
}
int main(int argc, char **argv)
{
cxxopts::Options options("fibo", "Print the fibonacci sequence up to a value 'n'");
options.add_options()("n,value", "The value to print to", cxxopts::value<int>()->default_value("10"));
auto result = options.parse(argc, argv);
auto n = result["value"].as<int>();
for (int x : view::iota(1) | view::take(n))
{
fmt::print("fib({}) = {}\n", x, fib(x));
}
}
Пример кода ссылается на библиотеки с открытым кодом: cxxopts, fmtи range-v3, которые доступны в общедоступном реестре vcpkg.https://github.com/Microsoft/vcpkg
Создание манифеста vcpkg (vcpkg.json)
Чтобы объявить эти зависимости, создайте файл с именем vcpkg.json в том же каталоге, что и проект.
vcpkg.json
{
"dependencies": [
"cxxopts",
"fmt",
"range-v3"
]
}
Необходимо указать только прямые зависимости проекта в списке "dependencies" , vcpkg разрешает и устанавливает все необходимые транзитивные зависимости.
Интеграция vcpkg с системой сборки
На этом шаге мы покажем, как интегрировать vcpkg с CMake или MSBuild, чтобы зависимости проекта автоматически устанавливались или восстанавливались при сборке проекта.
Если вы используете другую систему сборки, перейдите к следующему шагу: установите зависимости с помощью vcpkg.
Чтобы использовать vcpkg в проектах MSBuild, выполните следующую команду:
vcpkg integrate install
Вам нужно выполнить только команду vcpkg integrate install при первом включении интеграции MSBuild. Это позволяет интегрировать MSBuild для всех существующих и будущих проектов. Используйте vcpkg integrate remove для удаления интеграции на уровне системы MSBuild.
Этот метод интеграции автоматически добавляет пакеты, установленные vcpkg, в следующие свойства проекта: Include Directories, Link Directoriesи Link Libraries. Кроме того, это создает действие после сборки, которое гарантирует, что все необходимые библиотеки DLL копируются в выходную папку сборки. Это работает для всех решений и проектов с помощью Visual Studio 2017 или более поздней версии.
Установка зависимостей с помощью vcpkg
Если вы используете CMake или MSBuild и выполнили предыдущий шаг, вы можете перейти к следующему шагу: Сборка проекта.
Если вы используете другую систему сборки или хотите вручную установить зависимости, необходимо выполнить vcpkg install в каталоге с файлом манифеста.
PS D:\projects\manifest-example> vcpkg install
Detecting compiler hash for triplet x64-windows...
The following packages will be built and installed:
cxxopts:x64-windows -> 3.1.1
fmt:x64-windows -> 10.0.0
range-v3:x64-windows -> 0.12.0#1
* vcpkg-cmake:x64-windows -> 2023-05-04
* vcpkg-cmake-config:x64-windows -> 2022-02-06#1
Additional packages (*) will be modified to complete this operation.
Installing 1/5 vcpkg-cmake-config:x64-windows...
Installing 2/5 vcpkg-cmake:x64-windows...
Installing 3/5 cxxopts:x64-windows...
Installing 4/5 fmt:x64-windows...
Installing 5/5 range-v3:x64-windows...
Total install time: 48 s
cxxopts provides CMake targets:
# this is heuristically generated, and may not be correct
find_package(cxxopts CONFIG REQUIRED)
target_link_libraries(main PRIVATE cxxopts::cxxopts)
The package fmt provides CMake targets:
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE fmt::fmt)
# Or use the header-only version
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE fmt::fmt-header-only)
range-v3 provides CMake targets:
# this is heuristically generated, and may not be correct
find_package(range-v3 CONFIG REQUIRED)
target_link_libraries(main PRIVATE range-v3::meta range-v3::concepts range-v3::range-v3)
По завершении команды все встроенные пакеты будут присутствовать в каталоге vcpkg_installed. Конкретное расположение этого каталога зависит от системы сборки; обычно внутри выходной папки системы сборки или рядом с файлом vcpkg.json.
Сборка проекта
По умолчанию режим манифеста отключен в проектах MSBuild.
Чтобы включить манифесты в проекте, задайте свойство VcpkgEnableManifest в файле .vcxproj:
<PropertyGroup Label="Vcpkg">
<VcpkgEnableManifest>true</VcpkgEnableManifest>
</PropertyGroup>
Кроме того, можно включить режим манифеста в вызове MSBuild, передав msbuild /p:VcpkgEnableManifest=true в качестве параметра.
PS D:\projects\manifest-example> msbuild /p:VcpkgEnableManifest=true
MSBuild version 17.7.0-preview-23319-02+6829506b8 for .NET Framework
Build started 8/11/2023 11:29:50 AM.
Project "D:\projects\manifest-example\manifest-example.sln" on node 1 (default targets).
ValidateSolutionConfiguration:
Building solution configuration "Debug|x64".
Project "D:\projects\manifest-example\manifest-example.sln" (1) is building "D:\projects\manifest-example\manifest-example.vcxproj" (2) on node 1 (default targets).
PrepareForBuild:
(omitted)
InitializeBuildStatus:
(omitted)
ComputeStdModulesCompileInputs:
(omitted)
SetModuleDependencies:
Creating directory "x64\Debug\manifest.ceffc6eb_MD.tlog\".
VcpkgTripletSelection:
Using triplet "x64-windows" from "D:\projects\manifest-example\vcpkg_installed\x64-windows\x64-windows\"
Using normalized configuration "Debug"
VcpkgInstallManifestDependencies:
Installing vcpkg dependencies to D:\projects\manifest-example\vcpkg_installed\x64-windows\
Creating directory "D:\projects\manifest-example\vcpkg_installed\x64-windows\".
"D:\vcpkg\vcpkg.exe" install --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "D:\vcpkg\" "--x-manifest-root=D:\projects\manifest-example\" "--x-install-root=D:\projects\manifest-example\vcpkg_installed\x64-windows\"
"D:\vcpkg\vcpkg.exe" install --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "D:\vcpkg\" "--x-manifest-root=D:\projects\manifest-example\" "--x-install-root=D:\projects\manifest-example\vcpkg_installed\x64-windows\"
Detecting compiler hash for triplet x64-windows...
The following packages will be built and installed:
cxxopts:x64-windows -> 3.1.1
fmt:x64-windows -> 10.0.0
range-v3:x64-windows -> 0.12.0#1
* vcpkg-cmake:x64-windows -> 2023-05-04
* vcpkg-cmake-config:x64-windows -> 2022-02-06#1
(omitted)
ClCompile:
(omitted)
Link:
(omitted)
AppLocalFromInstalled:
"D:\vcpkg\vcpkg.exe" z-applocal --target-binary="D:\projects\manifest-example\x64\Debug\manifest-example.exe"
--installed-bin-dir="D:\projects\manifest-example\vcpkg_installed\x64-windows\x64-windows\debug\bin"
--tlog-file="x64\Debug\manifest.ceffc6eb.tlog\manifest-example.write.1u.tlog" --copied-files-log="x64\Debug\vcpkg.applocal.log"
D:\projects\manifest-example\x64\Debug\fmtd.dll
FinalizeBuildStatus:
(omitted)
Done Building Project "D:\projects\manifest-example\manifest-example.vcxproj" (default targets).
Done Building Project "D:\projects\manifest-example\manifest-example.sln" (default targets).
Build succeeded.
Дальнейшие действия
В этом руководстве вы установили зависимости для простого проекта с помощью файла манифеста.
Ниже приведены некоторые дополнительные задачи, которые необходимо выполнить следующим образом:
- Устанавливайте пакеты для пользовательских платформ, компиляторов или архитектур сборки, используя триплеты
- Закрепите ваши версии для повторяемых сборок с помощью системы контроля версий
- Повторно используйте двоичные файлы в запусках локальной или непрерывной интеграции, применяя двоичное кэширование
- Управление частными библиотеками с помощью пользовательских реестров