Как интегрировать Conan/vcpkg с современным target-based CMake?
Conan 2.x генерирует CMakeDeps/CMakeToolchain, после чего зависимости доступны как обычные find_package() imported targets. vcpkg в manifest mode автоматически подхватывается через переменную CMAKE_TOOLCHAIN_FILE.
Интеграция vcpkg
vcpkg в manifest mode (рекомендуется) использует файл vcpkg.json рядом с CMakeLists.txt:
{
"name": "myapp",
"version": "1.0.0",
"dependencies": [
"fmt",
{ "name": "boost-filesystem", "version>=": "1.82.0" }
]
}
Передайте toolchain-файл vcpkg при конфигурации:
cmake -B build \
-DCMAKE_TOOLCHAIN_FILE=/opt/vcpkg/scripts/buildsystems/vcpkg.cmake \
-DVCPKG_TARGET_TRIPLET=x64-linux
В CMakeLists.txt пакеты находятся стандартно:
find_package(fmt CONFIG REQUIRED)
find_package(Boost REQUIRED COMPONENTS filesystem)
target_link_libraries(myapp PRIVATE fmt::fmt Boost::filesystem)
Для CI через CMake Presets добавьте в CMakePresets.json:
{
"name": "ci",
"inherits": "base",
"toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"cacheVariables": {
"VCPKG_TARGET_TRIPLET": "x64-linux"
}
}
Интеграция Conan 2.x
Файл conanfile.txt или conanfile.py с генераторами CMakeDeps и CMakeToolchain:
[requires]
fmt/10.2.1
openssl/3.2.1
[generators]
CMakeDeps
CMakeToolchain
[layout]
cmake_layout
# Установка зависимостей и генерация файлов
conan install . --output-folder=build --build=missing -s build_type=Release
# Конфигурация с toolchain от Conan
cmake -B build \
-DCMAKE_TOOLCHAIN_FILE=build/conan_toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release
CMakeLists.txt остаётся стандартным:
find_package(fmt REQUIRED)
find_package(OpenSSL REQUIRED)
target_link_libraries(myapp
PRIVATE
fmt::fmt
OpenSSL::SSL
OpenSSL::Crypto
)
Conan через CMakeDeps: как работает
Conan 2.x генерирует в build/ файлы вида fmtConfig.cmake, fmtTargets.cmake. Когда CMake вызывает find_package(fmt), он ищет их в CMAKE_PREFIX_PATH, который автоматически выставляется через conan_toolchain.cmake.
Подводные камни
- vcpkg:
CMAKE_TOOLCHAIN_FILEдолжен быть передан при первой конфигурации — изменить после записи в кэш безcmake --freshневозможно. - vcpkg manifest mode и классический mode нельзя смешивать в одном репозитории — наличие
vcpkg.jsonавтоматически активирует manifest mode. - Conan 2.x несовместим с Conan 1.x профилями и рецептами — мигрируйте полностью.
- При кросс-компиляции с Conan нужно указывать два профиля:
--profile:build=default --profile:host=cross-arm; без этого host-зависимости собираются нативно. - vcpkg triplet по умолчанию статический (
x64-linux= static); для shared-библиотек нуженx64-linux-dynamic. - Conan не блокирует версии транзитивных зависимостей — два пакета могут требовать разные версии одной библиотеки, что Conan разрешает с предупреждением, выбирая одну.
- vcpkg caching в CI: без
VCPKG_BINARY_SOURCES(GitHub Actions Cache или Azure Blob) зависимости пересобираются при каждом запуске. - Смешивание vcpkg и системных пакетов через
find_package: CMake может найти системную версию вместо vcpkg при неправильном порядкеCMAKE_PREFIX_PATH.
Common mistakes
- Отвечать определением без production-сценария.
- Не называть runtime boundary, security boundary или failure mode.
- Игнорировать версию API, observability и тестовую проверку.
What the interviewer is testing
- Объясняет механизм своими словами и без выдуманных API.
- Называет реальные риски, диагностику и критерий корректности.
- Связывает ответ с текущей документацией и миграционными ограничениями.