CMakeMiddleTechnical

Как интегрировать 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.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

Sources

Related topics