Прим. пер.: Перевод и примеры исправлены, дополнены и адаптированы с учётом современных версий Conan 2, инструментов сборки и библиотек.
Управление зависимостями C++ может оказаться непростой задачей. Зачастую разработчику приходится самостоятельно заботиться о загрузке исходных кодов, интеграции готовых к использованию двоичных файлов, сборке, установке и связывании библиотек. В этой статье я расскажу вам о Conan — менеджере пакетов C/C++ с открытым исходным кодом, который отлично справляется с этими задачами.
Conan — это свободный менеджер пакетов с открытым исходным кодом (MIT), разработанный для C и C++. Он похож на NuGet и npm для .NET и JavaScript соответственно. Он может работать в любой операционной системе, поддерживающей Python. К ним относятся Linux, Mac, а также Windows.
Поскольку для C++ пока не существует стандартного менеджера пакетов, Conan пытается стать им. В последнее время этот инструмент привлёк больше внимания сообщества и завоевал доверие крупных компаний, таких как Huawei, Keysight и Mercedes-Benz [1].
В этой статье я сначала покажу вам, как настроить Conan. Затем я приведу пример, чтобы продемонстрировать, как этот инструмент работает на практике.
Установка
Распространенным и рекомендуемым способом установки Conan, например в Ubuntu, является использование pip:
$ pip3 install conan
Также допустимы следующие варианты:
openSUSE Linux:
sudo zypper install conan
Arch Linux (yay):
yay -S conan
Mac (HomeBrew):
brew install conan
Установка из исходного кода. Дополнительные инструкции см. по ссылке.
После завершения установки вы можете убедиться, что Conan работает нормально, введя команду:
$ conan --help
Примечание: в некоторых операционных системах после установки требуется перезагрузка.
Конан в действии
Чтобы увидеть, как можно использовать Conan для получения и сборки пакетов, давайте рассмотрим простой проект на C++, который зависит от сторонней библиотеки. Например, следующий исходный код зависит от SQLite. Он пытается открыть базу данных SQLite под названием «test.db». Если он не находит её, то создаёт новый файл базы данных с таким же названием. Если код не может открыть или создать файл, он выводит сообщение об ошибке SQLite.
#include <iostream>
#include <sqlite3.h>
int main()
{
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);
if (SQLITE_OK == rc) {
std::cout << "Opened database successfully \n";
sqlite3_close(db);
} else {
std::cout << "Can't open database: " << sqlite3_errmsg(db) << "\n";
}
return 0;
}
Чтобы собрать исходный код, нам нужно использовать Conan, который получит для нас пакет SQLite. Сначала нам нужно узнать название и версию пакета, который мы хотим использовать. Следующая команда выведет список всех sqlite3
пакетов, доступных на удалённом сервере conancenter:
$ conan remote list
conancenter: https://center2.conan.io [Verify SSL: True, Enabled: True]
$ conan search sqlite3* --remote=conancenter
Connecting to remote 'conancenter' anonymously
Found 34 pkg/version recipes matching sqlite3* in conancenter
conancenter
sqlite3
sqlite3/3.36.0
sqlite3/3.37.2
sqlite3/3.38.5
sqlite3/3.39.0
sqlite3/3.39.1
sqlite3/3.39.2
sqlite3/3.39.3
sqlite3/3.39.4
sqlite3/3.40.0
sqlite3/3.40.1
sqlite3/3.41.1
sqlite3/3.41.2
sqlite3/3.42.0
sqlite3/3.43.0
sqlite3/3.43.1
sqlite3/3.43.2
sqlite3/3.44.0
sqlite3/3.44.1
sqlite3/3.44.2
sqlite3/3.45.0
sqlite3/3.45.1
sqlite3/3.45.2
sqlite3/3.45.3
sqlite3/3.46.0
sqlite3/3.46.1
sqlite3/3.47.0
sqlite3/3.47.1
sqlite3/3.47.2
sqlite3/3.48.0
Давайте выберем самую новую версию 3.48.0. Далее нам нужно создать файл conanfile.txt
и указать полное название пакета. Также нам нужно указать генератор. Секция [generators] позволяет генерировать файлы, которые компиляторы или системы сборки будут использовать для поиска зависимостей и сборки проекта. В данном случае, поскольку наш проект основан на CMake, мы будем использовать CMakeDeps для генерации информации о том, где установлены файлы библиотеки SQLite, и CMakeToolchain для передачи информации о сборке в CMake с помощью файла CMake toolchain. Файл conanfile.txt
должен выглядеть следующим образом:
[requires]
sqlite3/3.48.0
[generators]
CMakeDeps
CMakeToolchain
Помимо conanfile.txt
, для сборки нашего проекта нам нужен профиль Conan. Профили Conan позволяют пользователям определять набор конфигураций для таких параметров, как компилятор, конфигурация сборки, архитектура, общие или статические библиотеки и т. д. По умолчанию Conan не пытается автоматически определить профиль, поэтому нам нужно его создать. Чтобы Conan попытался определить профиль на основе текущей операционной системы и установленных инструментов, выполните:
$ conan detect --force
Это определит операционную систему, архитектуру сборки и настройки компилятора на основе среды. Это также установит конфигурацию сборки как Release по умолчанию. Созданный профиль будет сохранен в домашней папке Conan с именем default и будет использоваться Conan во всех командах по умолчанию, если только в командной строке не указан другой профиль. Примером вывода этой команды для Linux может быть:
$ conan profile detect --force
detect_api: Found cc=gcc- 14.2.1
detect_api: gcc>=5, using the major as version
detect_api: gcc C++ standard library: libstdc++11
Detected profile:
[settings]
arch=x86_64
build_type=Release
compiler=gcc
compiler.cppstd=gnu17
compiler.libcxx=libstdc++11
compiler.version=14
os=Linux
Последний файл, который нам нужно создать, — это CMakeLists.txt
. В приведённом ниже примере есть все необходимые настройки для запуска нашего проекта.
cmake_minimum_required (VERSION 3.30)
project(TestConan CXX)
set(CMAKE_CXX_STANDARD 17)
find_package(SQLite3 REQUIRED)
add_executable(testConan test_conan.cpp)
target_link_libraries(testConan SQLite::SQLite3)
Теперь, когда наш проект готов, следующим шагом будет установка и сборка библиотеки зависимостей SQLite. Для этого нам нужно запустить команду установки Conan, которая создаст новый каталог с именем build
. Для этого введите следующее:
$ conan install . --output-folder=build --build=missing
Как вы можете видеть, произошло несколько событий:
Conan установил библиотеку SQLite с удалённого сервера, который по умолчанию должен быть сервером Conan Center, если библиотека доступна. На этом сервере хранятся как рецепты Conan, то есть файлы, определяющие, как должны быть собраны библиотеки, так и двоичные файлы, которые можно использовать повторно, чтобы каждый раз не собирать их из исходников.
Conan сгенерировал несколько файлов в папке build. Эти файлы были сгенерированы как с помощью
CMakeToolchain
, так иCMakeDeps
генераторов, которые мы установили в conanfile.txt.CMakeDeps
генерирует файлы так, чтобыCMake
находил библиотеку SQLite, которую мы только что загрузили. С другой стороны,CMakeToolchain
генерирует файлtoolchain
дляCMake
, чтобы мы могли прозрачно создавать наш проект с помощьюCMake
, используя те же настройки, которые мы определили для нашего профиля по умолчанию.
Далее давайте соберём исходный код. Я бы хотел использовать систему сборки Ninja (подробнее о Ninja в этой статье). Для создания введите следующие команды:
$ cd build
$ cmake .. -G Ninja -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" -DCMAKE_BUILD_TYPE=Release
$ ninja
В папке должен быть создан исполняемый файл testConan
. Вы можете запустить его для тестирования программы. Наберите:
$ ./testConan
Opened database successfully
Вы должны увидеть, что программа выводит правильное сообщение и в папке build
был создан новый файл базы данных с именем «test.db».
Полезные команды
Собрать все недостающие пакеты из исходных кодов, если на вашем компьютере нет готовых сборок:
conan install .. -b missing
Проверить зависимости вашего текущего проекта:
conan graph info ..
Сгенерировать график зависимостей для текущего проекта:
conan graph info --out-file graph.html -f html ..
Ссылки
[1] https://conan.io /