vcpkg: встановлення, основні команди та 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 з будь-якої папки
# 1. Потрібні утиліти для завантаження та збірки
sudo apt install git curl zip unzip tar build-essential pkg-config
# 2. Клонувати репозиторій
cd ~
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
# 3. Запустити bootstrap
./bootstrap-vcpkg.sh
# 4. Змінна VCPKG_ROOT та PATH (додайте в ~/.bashrc)
echo 'export VCPKG_ROOT=$HOME/vcpkg' >> ~/.bashrc
echo 'export PATH=$VCPKG_ROOT:$PATH' >> ~/.bashrc
source ~/.bashrc
# 1. Потрібні утиліти
xcode-select --install
brew install pkg-config
# 2. Клонувати репозиторій
cd ~
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
# 3. Запустити bootstrap
./bootstrap-vcpkg.sh
# 4. Змінна VCPKG_ROOT та PATH (додайте в ~/.zshrc)
echo 'export VCPKG_ROOT=$HOME/vcpkg' >> ~/.zshrc
echo 'export PATH=$VCPKG_ROOT:$PATH' >> ~/.zshrc
source ~/.zshrc
Скрипт bootstrap завантажує готовий виконуваний файл vcpkg. Саме змінна VCPKG_ROOT дозволяє CMake та IDE знайти встановлений vcpkg, тому її задають одразу. Перевірка:
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) порту, про які розповімо нижче:
Повідомлення «The result may be outdated» нагадує, що пошук працює по локальній копії каталогу. Щоб побачити свіжі версії портів, потрібно оновити репозиторій vcpkg (git pull).
Для перегляду залежностей порту використовується depend-info:
vcpkg depend-info spdlog
Ланцюжок залежностей видно одразу: 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). Зверніть увагу на залежності й на повідомлення наприкінці:
Що тут важливо:
- Імена пакетів
fmt:arm64-osx@12.1.0складаються з порту, triplet і версії. Tripletarm64-osxvcpkg вибрав автоматично під Mac на Apple Silicon. Restored 3 package(s) ... archives— пакети взято з бінарного кешу. Якби кешу не було, vcpkg завантажував би й збирав код, і це заняло б хвилини, а не 12 мілісекунд.- Повідомлення «The package fmt provides CMake targets» — підказка, як підключити бібліотеку у
CMakeLists.txt. Ту саму інформацію можна прочитати у файліshare/fmt/usage.
Тепер подивимось, що з'явилось на диску:
Файли розкладені за стандартною схемою 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 fmt | vcpkg install (без імен) або автоматично під час CMake |
| Де описані залежності | Ніде: ви виконали команду вручну | У файлі vcpkg.json у проєкті |
| Де встановлено | У спільну папку $VCPKG_ROOT/installed | У папку проєкту (build/vcpkg_installed) |
| Відтворюваність | Низька: залежить від того, що стоїть на комп'ютері | Висока: залежності записані й зафіксовані |
| Підходить для | Швидких експериментів | Навчальних та робочих проєктів |
Класичний режим зручний, щоб швидко спробувати бібліотеку. Для власних проєктів використовується manifest-режим: він описаний у наступній лекції.
Triplets
Triplet — це набір правил, що визначає, для якої платформи й у якому вигляді збирається пакет. Назва має вигляд <архітектура>-<ОС>[-<варіант>], наприклад x64-windows або arm64-osx. Triplet вирішує три питання:
- Яка архітектура процесора? (
x86,x64,arm,arm64). - Яка операційна система? (
windows,linux,osx,android). - Як збирати? Статично чи динамічно, з якою бібліотекою часу виконання (CRT).
Реальний вміст triplets
Triplet — це невеликий файл CMake, який можна прочитати. Ось значення основних із них, зняті з файлів папки triplets/ каталогу vcpkg:
| Triplet | Архітектура | Бібліотеки | CRT (Windows) | Примітка |
|---|---|---|---|---|
x86-windows | x86 | динамічні (DLL) | динамічний | 32-бітна Windows |
x64-windows | x64 | динамічні (DLL) | динамічний | Типовий вибір для Windows |
x64-windows-static | x64 | статичні | статичний | Програма без залежностей від DLL |
x64-windows-static-md | x64 | статичні | динамічний | Статичні бібліотеки з динамічним CRT |
x64-windows-release | x64 | динамічні | динамічний | Збирає лише Release (приблизно вдвічі швидше) |
x64-linux | x64 | статичні | — | Типовий вибір для Linux |
x64-linux-dynamic | x64 | динамічні | — | Спільнотний triplet |
arm64-osx | arm64 | статичні | — | Mac з Apple Silicon |
x64-osx | x64 | статичні | — | Mac з процесором Intel (спільнотний triplet) |
arm-linux | arm | статичні | — | Для 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 (розглянемо в окремій лекції).
Питання для самоперевірки
portfile.cmake (описує, як завантажити й зібрати) та vcpkg.json (назва, версія, залежності). Пакет — результат збірки порту для конкретного triplet.fmt залежить від них як від інструментів збірки. Вони з'являються автоматично й додаткових дій від користувача не вимагають.x64-linux збирає статичні бібліотеки (.a), які вбудовуються у програму. x64-linux-dynamic збирає динамічні (.so), які потрібно мати поруч під час запуску. Приставка -dynamic у цьому разі позначає саме нетиповий випадок.vcpkg.json, і це знімає проблему.Практичне завдання
- Встановіть vcpkg і задайте змінну
VCPKG_ROOT. Перевіртеvcpkg version. - Знайдіть бібліотеку для роботи з CSV командою
vcpkg search csv. Скільки пакетів знайдено? - Виведіть залежності пакета
spdlogкомандоюvcpkg depend-info spdlog. - Встановіть
fmtу класичному режимі та знайдіть файлfmt/core.hу папціinstalled. - Відкрийте файл triplet для вашої системи (папка
triplets/) та визначте, статичні чи динамічні бібліотеки vcpkg збирає за замовчуванням.
installed/<triplet>/include/fmt/core.h та, наприклад, VCPKG_LIBRARY_LINKAGE static у файлі triplet для Linux або macOS. Для Windows triplet x64-windows має VCPKG_LIBRARY_LINKAGE dynamic.Резюме
🛠️ Встановлення
git clone і bootstrap-vcpkg. Змінна VCPKG_ROOT дозволяє CMake та IDE знайти vcpkg.⌨️ Команди
search, install, list, remove, update, upgrade --no-dry-run, export, depend-info. Залежності ставляться автоматично.🗂️ Два режими
vcpkg.json у проєкті, відтворювана збірка.🎯 Triplets
x64-windows динамічний.vcpkg.json. Це основний робочий сценарій.Пакетні менеджери для C++: vcpkg, Conan, CPM та системні пакети
Навіщо C++ потрібні пакетні менеджери, порівняння vcpkg, Conan, CPM, Hunter і системних менеджерів, базове використання Conan 2, вибір інструмента для курсу.
vcpkg і CMake: toolchain-файл, manifest vcpkg.json, IDE
Як підключити vcpkg до CMake-проєкту: toolchain-файл і порядок його підключення, змінні середовища, пресети, manifest-режим з vcpkg.json, повний приклад з fmt, spdlog, nlohmann-json і cxxopts, налаштування VS Code, Visual Studio та CLion.