Conan для C++: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Conan для C++: полное руководство с примерами

1. Что это и зачем нужна

Conan — это децентрализованный менеджер пакетов с открытым исходным кодом, предназначенный для языка C++. Он решает одну из самых болезненных проблем в экосистеме C++: управление зависимостями. В отличие от других языков (Python с pip, JavaScript с npm, Rust с Cargo), C++ долгое время не имел стандартного инструмента для автоматической загрузки, сборки и интеграции сторонних библиотек. Разработчикам приходилось вручную скачивать исходники, настраивать include-пути, линковать библиотеки и мучительно решать конфликты версий. Conan автоматизирует весь этот процесс.

Conan поддерживает все основные операционные системы (Windows, Linux, macOS) и компиляторы (GCC, Clang, MSVC, MinGW). Он умеет работать с разными системами сборки: CMake, MSBuild, Makefiles, SCons, Bazel и другими. Пакеты в Conan могут распространяться как в виде исходного кода (тогда Conan соберет их под вашу платформу), так и в виде готовых бинарных файлов. Это экономит часы времени, особенно в больших проектах с десятками зависимостей.

Ключевая особенность Conan — это его модель профилей. Вы можете определить профиль для каждой платформы/компилятора (например, "clang-14-release-x86_64" или "msvc-2022-debug-x86"). Conan автоматически подберет или соберет пакеты, совместимые с вашим профилем. Это делает его незаменимым инструментом для кросс-платформенной разработки и CI/CD пайплайнов.

2. Установка

Conan написан на Python и устанавливается через pip. Рекомендуется устанавливать его в виртуальное окружение (venv), чтобы избежать конфликтов с системными пакетами Python.

# Установка через pip (рекомендуется в виртуальном окружении)
python -m pip install conan

# Проверка установки
conan --version

# Обновление до последней версии
python -m pip install --upgrade conan

После установки рекомендуется сразу настроить удаленный репозиторий (remote) по умолчанию — ConanCenter. Он уже добавлен по умолчанию, но вы можете проверить это командой:

conan remote list

Если ConanCenter отсутствует, добавьте его:

conan remote add conancenter https://center.conan.io

3. Быстрый старт — минимальный рабочий пример

Создадим простой проект, который использует библиотеку fmtlib (форматирование строк) и zlib (сжатие данных).

Шаг 1: Структура проекта

mkdir my_conan_project
cd my_conan_project
mkdir src

Шаг 2: Файл conanfile.txt

[requires]
fmt/10.2.1
zlib/1.3.1

[generators]
CMakeDeps
CMakeToolchain

[layout]
cmake_layout

Шаг 3: CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(MyConanProject CXX)

find_package(fmt REQUIRED)
find_package(ZLIB REQUIRED)

add_executable(my_app src/main.cpp)
target_link_libraries(my_app PRIVATE fmt::fmt ZLIB::ZLIB)

Шаг 4: src/main.cpp

#include <fmt/core.h>
#include <zlib.h>
#include <iostream>

int main() {
    // Используем fmt
    fmt::print("Hello from Conan! Version: {}\n", FMT_VERSION);

    // Используем zlib
    std::cout << "zlib version: " << zlibVersion() << std::endl;

    // Простой пример сжатия
    const char* data = "Hello, Conan! This string will be compressed.";
    uLong source_len = strlen(data) + 1;
    uLong dest_len = compressBound(source_len);
    char* compressed = new char[dest_len];

    int ret = compress(reinterpret_cast(compressed), &dest_len,
                       reinterpret_cast(data), source_len);
    if (ret == Z_OK) {
        fmt::print("Compression successful! Original: {} bytes -> Compressed: {} bytes\n",
                   source_len, dest_len);
    } else {
        fmt::print("Compression failed with error code: {}\n", ret);
    }

    delete[] compressed;
    return 0;
}

Шаг 5: Сборка и запуск

# Установка зависимостей
conan install . --build=missing

# Конфигурация CMake
cmake --preset conan-default

# Сборка
cmake --build --preset conan-release

# Запуск
./build/Release/my_app

Вы должны увидеть вывод с версиями библиотек и сообщением об успешном сжатии.

4. Основные методы/функции/классы

Ниже приведены ключевые команды и API Conan, которые вы будете использовать постоянно. Команды выполняются в терминале, если не указано иное.

4.1 conan install

Сигнатура: conan install <path> [options]

Что делает: Устанавливает зависимости, указанные в conanfile.txt или conanfile.py, и генерирует файлы для системы сборки (CMake, MSBuild и т.д.).

Пример:

# Установка зависимостей для текущей папки, сборка отсутствующих бинарников
conan install . --build=missing

# Установка с указанием профиля
conan install . --profile=clang-14-release

# Установка конкретного пакета без проекта
conan install --requires=fmt/10.2.1 --generator=CMakeDeps

4.2 conan create

Сигнатура: conan create <path> [user/channel] [options]

Что делает: Собирает пакет из рецепта (conanfile.py) и помещает его в локальный кэш. Используется разработчиками библиотек для тестирования и публикации.

Пример:

# Сборка пакета из текущей папки с тегом mycompany/stable
conan create . mycompany/stable

# Сборка с переопределением опций
conan create . mycompany/testing -o shared=True

4.3 conan search

Сигнатура: conan search <query> [options]

Что делает: Ищет пакеты в удаленных репозиториях или локальном кэше по имени или шаблону.

Пример:

# Поиск всех версий библиотеки fmt
conan search fmt

# Поиск пакетов, содержащих "boost" в имени
conan search boost --remote=conancenter

# Поиск в локальном кэше
conan search "*"

4.4 conan info

Сигнатура: conan info <path> [options]

Что делает: Показывает подробную информацию о зависимостях проекта: дерево зависимостей, версии, лицензии, опции.

Пример:

# Показать дерево зависимостей для текущего проекта
conan info .

# Показать информацию о конкретном пакете
conan info fmt/10.2.1

# Вывести в формате графа (для визуализации)
conan info . --graph=graph.html

4.5 conan profile

Сигнатура: conan profile [subcommand] [options]

Что делает: Управляет профилями — наборами настроек (компилятор, архитектура, стандартная библиотека и т.д.). Позволяет создавать, редактировать, показывать и удалять профили.

Пример:

# Показать текущий профиль по умолчанию
conan profile show

# Создать новый профиль на основе текущего
conan profile new --detect my-profile

# Установить профиль по умолчанию
conan profile default my-profile

# Показать список всех профилей
conan profile list

4.6 conan remote

Сигнатура: conan remote [subcommand] [options]

Что делает: Управляет удаленными репозиториями (remotes). Позволяет добавлять, удалять, обновлять и просматривать списки репозиториев, из которых Conan скачивает пакеты.

Пример:

# Добавить удаленный репозиторий
conan remote add myrepo https://myrepo.com

# Удалить репозиторий
conan remote remove myrepo

# Обновить URL репозитория
conan remote update myrepo https://newurl.com

# Показать список репозиториев с приоритетами
conan remote list

4.7 conan build

Сигнатура: conan build <path> [options]

Что делает: Запускает сборку проекта, используя команду сборки, указанную в conanfile.py (обычно вызывает CMake, Make или другую систему). Удобно для интеграции с CI.

Пример:

# Сборка проекта из текущей папки (требуется conanfile.py с методом build())
conan build .

# Сборка с передачей аргументов в систему сборки
conan build . --build-args="-j4"

4.8 conan cache

Сигнатура: conan cache [subcommand] [options]

Что делает: Управляет локальным кэшем пакетов. Позволяет очищать кэш, просматривать его содержимое, восстанавливать поврежденные пакеты.

Пример:

# Очистить весь кэш
conan cache clean

# Очистить кэш для конкретного пакета
conan cache clean fmt

# Показать список пакетов в кэше
conan cache list

# Восстановить кэш (переустановить все пакеты)
conan cache restore

4.9 conan export-pkg

Сигнатура: conan export-pkg <path> [user/channel] [options]

Что делает: Экспортирует уже собранные бинарные файлы в локальный кэш как пакет Conan. Используется, когда у вас есть предварительно собранная библиотека, и вы хотите сделать из нее пакет.

Пример:

# Экспорт предварительно собранной библиотеки
conan export-pkg . mycompany/stable --package-folder=./mybuild

4.10 conan graph

Сигнатура: conan graph <subcommand> [options]

Что делает: Предоставляет расширенные возможности для анализа графа зависимостей. Позволяет вычислять, объяснять и визуализировать зависимости.

Пример:

# Вычислить граф зависимостей и вывести в HTML
conan graph info . --graph=graph.html

# Объяснить, почему была выбрана конкретная версия пакета
conan graph explain fmt

# Проверить граф на наличие конфликтов
conan graph check .

5. Реальный практический пример (100-200 строк кода)

Создадим полноценный пример: приложение для обработки изображений, использующее библиотеки stb_image (загрузка изображений) и OpenCV (компьютерное зрение). Это покажет, как Conan управляет сложными зависимостями.

Шаг 1: Структура проекта

mkdir conan_image_processor
cd conan_image_processor
mkdir src include data

Шаг 2: conanfile.txt

[requires]
stb/cci.20230920
opencv/4.9.0

[generators]
CMakeDeps
CMakeToolchain

[layout]
cmake_layout

[options]
opencv:shared=True
opencv:dnn=False
opencv:gapi=False

Шаг 3: CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(ImageProcessor CXX)

find_package(stb REQUIRED)
find_package(OpenCV REQUIRED COMPONENTS core imgproc highgui imgcodecs)

add_executable(image_processor
    src/main.cpp
    src/image_utils.cpp
)

target_include_directories(image_processor PRIVATE include)
target_link_libraries(image_processor PRIVATE
    stb::stb
    ${OpenCV_LIBS}
)

# Копируем тестовое изображение в папку сборки
configure_file(${CMAKE_SOURCE_DIR}/data/test.png ${CMAKE_BINARY_DIR}/test.png COPYONLY)

Шаг 4: include/image_utils.h

#ifndef IMAGE_UTILS_H
#define IMAGE_UTILS_H

#include <string>
#include <vector>

struct ImageData {
    unsigned char* data;
    int width;
    int height;
    int channels;
};

ImageData load_image_stb(const std::string& filename);
void save_image_stb(const std::string& filename, const ImageData& img);
void apply_grayscale_opencv(const std::string& input_path, const                    

Рекомендаций