CMake і vcpkg

vcpkg: встановлення, основні команди та triplets

Що таке vcpkg, встановлення на Windows, Linux і macOS, змінна VCPKG_ROOT, команди search, install, list, remove, upgrade, export, класичний і manifest режими, triplets та їхні реальні властивості.

vcpkg: встановлення, основні команди та triplets

🎯 Мета лекції

  • Встановити vcpkg і налаштувати змінну VCPKG_ROOT.
  • Користуватися командами search, install, list, remove, upgrade, export.
  • Розрізняти класичний і manifest режими.
  • Читати назви triplets і розуміти, чим вони відрізняються (тип бібліотек, архітектура, ОС).

🔑 Ключові терміни

  • Порт (port): рецепт збірки бібліотеки (набір файлів portfile.cmake і vcpkg.json).
  • Triplet: опис цільової платформи: архітектура, ОС, тип лінкування.
  • Класичний режим: глобальне встановлення бібліотек командою vcpkg install <пакет>.
  • Manifest-режим: залежності проєкту описані у файлі vcpkg.json.

Лекція про пакетні менеджери закінчилась вибором vcpkg. Далі розглядається, як його встановити, і що саме він робить при встановленні пакета.

Що таке vcpkg

vcpkg — кросплатформний пакетний менеджер для C та C++ від Microsoft. Він завантажує вихідний код бібліотеки, збирає її вашим компілятором і розкладає результат так, щоб CMake знайшов його через find_package.

Ключові особливості:

  • Великий каталог. На момент підготовки лекції каталог містить понад 2700 портів: від fmt та spdlog до boost, opencv і qtbase.
  • Три операційні системи. Windows, Linux і macOS, а також Android, iOS, WebAssembly та інші цільові платформи.
  • Інтеграція з CMake. Один параметр CMAKE_TOOLCHAIN_FILE підключає vcpkg до проєкту.
  • Інтеграція з IDE. Visual Studio, VS Code (CMake Tools) і CLion вміють працювати з vcpkg.
  • Відтворюваність. Залежності та їхні версії описуються у файлі, який зберігається в репозиторії.
  • Відкритий код і безкоштовність. Ліцензія MIT.

Встановлення vcpkg

vcpkg — це звичайний git-репозиторій, у якому є скрипт початкового налаштування. Встановлення складається з двох кроків: клонування й виконання bootstrap. Для цього потрібен Git.

# 1. Клонувати репозиторій
cd C:\
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg

# 2. Запустити скрипт початкового налаштування
.\bootstrap-vcpkg.bat

# 3. Задати змінну VCPKG_ROOT (PowerShell)
[Environment]::SetEnvironmentVariable("VCPKG_ROOT", "C:\vcpkg", "User")

# 4. Додати C:\vcpkg до PATH, щоб викликати vcpkg з будь-якої папки

Скрипт bootstrap завантажує готовий виконуваний файл vcpkg. Саме змінна VCPKG_ROOT дозволяє CMake та IDE знайти встановлений vcpkg, тому її задають одразу. Перевірка:

vcpkg version
$ vcpkg version
vcpkg package management program version 2025-11-19-da1f056dc0775ac651bea7e3fbbf4066146a55f3
See LICENSE.txt for license information.
Рядок 2025-11-19-... — дата збірки програми vcpkg та хеш коміту. У вас він буде іншим. Окремо існує каталог портів (папка ports/ у репозиторії), його версія визначається комітом, на який ви переключені. Ця відмінність між програмою та каталогом важлива для розділу про версії.

Інтеграція з Visual Studio

# Windows: зробити бібліотеки vcpkg доступними в проєктах Visual Studio
vcpkg integrate install

Команда змінює налаштування користувача так, що проєкти Visual Studio (MSBuild) бачать встановлені через vcpkg бібліотеки без додаткових налаштувань. Для CMake-проєктів вона не потрібна: там використовується toolchain-файл.

vcpkg integrate install також може показати підказку з параметром -DCMAKE_TOOLCHAIN_FILE: це шлях до файлу scripts/buildsystems/vcpkg.cmake у вашому vcpkg. Його легко скопіювати.

Основні команди

Пошук пакетів

# Знайти бібліотеку
vcpkg search json
vcpkg search boost

# Усі доступні пакети
vcpkg search

Результат містить назву порту, версію й короткий опис. Рядки у форматі порт[ознака] — це необов'язкові функції (features) порту, про які розповімо нижче:

vcpkg search spdlog
$ vcpkg search spdlog
dartsim[spdlog] Support spdlog as underlying logging framework
g2o[spdlog] Use spdlog for logging
spdlog 1.16.0 Very fast, header-only/compiled, C++ logging library.
spdlog[benchmark] Use google benchmark
spdlog[wchar] Build with wchar_t (Windows only)
The result may be outdated. Run `git pull` to get the latest results.

Повідомлення «The result may be outdated» нагадує, що пошук працює по локальній копії каталогу. Щоб побачити свіжі версії портів, потрібно оновити репозиторій vcpkg (git pull).

Для перегляду залежностей порту використовується depend-info:

vcpkg depend-info spdlog
vcpkg depend-info spdlog
vcpkg-cmake:
vcpkg-cmake-config:
fmt: vcpkg-cmake, vcpkg-cmake-config
spdlog: fmt, vcpkg-cmake, vcpkg-cmake-config

Ланцюжок залежностей видно одразу: spdlog потребує fmt, а обидва — службових портів vcpkg-cmake і vcpkg-cmake-config. Саме про них згадує нумерація кроків при встановленні: vcpkg ставить їх автоматично.

Встановлення

# Один пакет
vcpkg install fmt
vcpkg install nlohmann-json

# Кілька пакетів
vcpkg install fmt spdlog cxxopts

# Пакет для конкретного triplet
vcpkg install fmt:x64-windows

Для наочності встановимо fmt у тимчасову папку (параметр --x-install-root дозволяє не змінювати основну установку vcpkg). Зверніть увагу на залежності й на повідомлення наприкінці:

vcpkg install fmt
$ vcpkg install fmt --x-install-root=./installed
Compiler found: /usr/bin/c++
Restored 3 package(s) from /Users/student/.cache/vcpkg/archives in 19.7 ms.
Installing 1/3 vcpkg-cmake:arm64-osx@2024-04-23...
Installing 2/3 vcpkg-cmake-config:arm64-osx@2024-05-23...
Installing 3/3 fmt:arm64-osx@12.1.0...
fmt:arm64-osx package ABI: 9ff3d18a0009ada522e13a5750f3a1ecc0c7331dc8fc469a6ca7c00963588576
Total install time: 12 ms
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)
All requested installations completed successfully in: 12 ms

Що тут важливо:

  • Імена пакетів fmt:arm64-osx@12.1.0 складаються з порту, triplet і версії. Triplet arm64-osx vcpkg вибрав автоматично під Mac на Apple Silicon.
  • Restored 3 package(s) ... archives — пакети взято з бінарного кешу. Якби кешу не було, vcpkg завантажував би й збирав код, і це заняло б хвилини, а не 12 мілісекунд.
  • Повідомлення «The package fmt provides CMake targets» — підказка, як підключити бібліотеку у CMakeLists.txt. Ту саму інформацію можна прочитати у файлі share/fmt/usage.

Тепер подивимось, що з'явилось на диску:

vcpkg list та вміст installed/
$ vcpkg list --x-install-root=./installed
fmt:arm64-osx 12.1.0 {fmt} is an open-source formatting library provi...
vcpkg-cmake-config:arm64-osx 2024-05-23
vcpkg-cmake:arm64-osx 2024-04-23
$ ls installed/arm64-osx
debug include lib share
$ ls installed/arm64-osx/lib
libfmt.a pkgconfig

Файли розкладені за стандартною схемою include/, lib/, share/, а папка debug/ містить Debug-варіант бібліотеки. Назва папки arm64-osx збігається з triplet: різні triplets зберігаються окремо.

Керування пакетами

# Список встановлених пакетів
vcpkg list

# Видалити пакет
vcpkg remove fmt

# Видалити пакет разом з тими, що від нього залежать
vcpkg remove --recurse fmt

# Показати, які пакети можна оновити
vcpkg update

# Оновити всі встановлені пакети
vcpkg upgrade --no-dry-run

Команда vcpkg upgrade без --no-dry-run лише показує, що буде оновлено: це захист від випадкових змін. Щоб самі файли vcpkg (програма й каталог портів) оновились, потрібно виконати в його папці:

cd $VCPKG_ROOT
git pull
./bootstrap-vcpkg.sh   # на Windows: .\bootstrap-vcpkg.bat

Експорт

# Зібрати встановлені пакети у zip-архів
vcpkg export fmt spdlog --zip

# Експортувати у вигляді папки (без архіву)
vcpkg export fmt spdlog --raw

Експорт зручний, коли бібліотеки потрібно передати комп'ютеру без доступу до інтернету або без vcpkg.

Довідка

vcpkg help
vcpkg help install
vcpkg help triplet

Два режими роботи

vcpkg працює у двох режимах, і розуміння різниці визначає всю подальшу роботу.

ХарактеристикаКласичний режимManifest-режим
Командаvcpkg install fmtvcpkg install (без імен) або автоматично під час CMake
Де описані залежностіНіде: ви виконали команду вручнуУ файлі vcpkg.json у проєкті
Де встановленоУ спільну папку $VCPKG_ROOT/installedУ папку проєкту (build/vcpkg_installed)
ВідтворюваністьНизька: залежить від того, що стоїть на комп'ютеріВисока: залежності записані й зафіксовані
Підходить дляШвидких експериментівНавчальних та робочих проєктів

Класичний режим зручний, щоб швидко спробувати бібліотеку. Для власних проєктів використовується manifest-режим: він описаний у наступній лекції.

Triplets

Triplet — це набір правил, що визначає, для якої платформи й у якому вигляді збирається пакет. Назва має вигляд <архітектура>-<ОС>[-<варіант>], наприклад x64-windows або arm64-osx. Triplet вирішує три питання:

  1. Яка архітектура процесора? (x86, x64, arm, arm64).
  2. Яка операційна система? (windows, linux, osx, android).
  3. Як збирати? Статично чи динамічно, з якою бібліотекою часу виконання (CRT).

Реальний вміст triplets

Triplet — це невеликий файл CMake, який можна прочитати. Ось значення основних із них, зняті з файлів папки triplets/ каталогу vcpkg:

TripletАрхітектураБібліотекиCRT (Windows)Примітка
x86-windowsx86динамічні (DLL)динамічний32-бітна Windows
x64-windowsx64динамічні (DLL)динамічнийТиповий вибір для Windows
x64-windows-staticx64статичністатичнийПрограма без залежностей від DLL
x64-windows-static-mdx64статичнідинамічнийСтатичні бібліотеки з динамічним CRT
x64-windows-releasex64динамічнідинамічнийЗбирає лише Release (приблизно вдвічі швидше)
x64-linuxx64статичні—Типовий вибір для Linux
x64-linux-dynamicx64динамічні—Спільнотний triplet
arm64-osxarm64статичні—Mac з Apple Silicon
x64-osxx64статичні—Mac з процесором Intel (спільнотний triplet)
arm-linuxarmстатичні—Для 32-бітних Raspberry Pi
Часто стверджують, що x64-linux дає динамічні бібліотеки, а x64-linux-static — статичні. Це неправильно: на Linux і macOS за замовчуванням бібліотеки статичні, а triplet x64-linux-static у каталозі відсутній. Динамічний варіант для Linux називається x64-linux-dynamic. Перевіряйте поточний список командою vcpkg help triplet.

Різницю між статичним і динамічним варіантами видно в самому файлі triplet. Для Linux:

set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_CMAKE_SYSTEM_NAME Linux)

Для Windows із DLL (x64-windows):

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

Змінні VCPKG_LIBRARY_LINKAGE і VCPKG_CRT_LINKAGE керують типом бібліотек та бібліотекою часу виконання. Окремо VCPKG_BUILD_TYPE release (triplet x64-windows-release) вимикає збірку Debug-варіанта, що приблизно вдвічі скорочує час збірки.

Який triplet використовується за замовчуванням

Якщо triplet не вказано, vcpkg підбирає його за вашою системою: x64-windows (Windows 64-bit), x64-linux (Linux 64-bit), arm64-osx або x64-osx (macOS залежно від процесора). Змінити вибір можна трьома способами:

# 1. У команді vcpkg
vcpkg install fmt:x64-windows-static

# 2. Через змінну середовища для vcpkg
export VCPKG_DEFAULT_TRIPLET=x64-linux-dynamic

# 3. Через CMake (відомий як цільовий triplet проєкту)
cmake -B build -DVCPKG_TARGET_TRIPLET=x64-windows-static \
      -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake
Дві змінні легко сплутати. VCPKG_TARGET_TRIPLET задає платформу, для якої збираємо. VCPKG_HOST_TRIPLET — платформа, на якій виконується збірка, потрібна лише для кросплатформної збірки (наприклад, збираємо для Raspberry Pi на x64 Linux).

Власний triplet

Якщо готові triplets не підходять, можна створити власний файл, наприклад, my-triplets/x64-windows-static-release.cmake:

set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE static)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_BUILD_TYPE release)

і підключити його опцією --overlay-triplets=my-triplets, або в manifest-режимі через vcpkg-configuration.json (розглянемо в окремій лекції).

Питання для самоперевірки

Практичне завдання

Резюме

🛠️ Встановлення

git clone і bootstrap-vcpkg. Змінна VCPKG_ROOT дозволяє CMake та IDE знайти vcpkg.

⌨️ Команди

search, install, list, remove, update, upgrade --no-dry-run, export, depend-info. Залежності ставляться автоматично.

🗂️ Два режими

Класичний: ручна команда й спільна папка. Manifest: vcpkg.json у проєкті, відтворювана збірка.

🎯 Triplets

Архітектура, ОС і тип лінкування. На Linux та macOS бібліотеки за замовчуванням статичні, на Windows x64-windows динамічний.
Наступна лекція: як підключити vcpkg до CMake-проєкту через toolchain-файл і написати manifest vcpkg.json. Це основний робочий сценарій.
Copyright © 2026