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 Также в библиотеке
HTTP-клиент для Kotlin: Топ библиотек для работы с сетью
Отправка SMS на C# (.NET): Интеграция с API SMS-сервисов
Очереди задач в C# (.NET): System.Threading.Channels и TPL Dataflow
JWT токены в Kotlin: генерация, проверка и использование с io.jsonwebtoken