Найти в Дзене

Устанавливаем библиотеки Boost с помощью пакетного менеджера Conan

В мире, наверное, не найдется ни одного программиста на С++, который не слышал о Boost. Boost — собрание библиотек классов, использующих функциональность языка C++, и предоставляющих удобный кроссплатформенный высокоуровневый интерфейс для решения различных задач программирования, таких как работа с файлами, потоками, регулярными выражениями, генерацией псевдослучайных чисел, обработкой изображений, модульным тестированием и т. п. Библиотеки распространяется по лицензии Boost Software License, разработанной для того, чтобы Boost можно было использовать как со свободным, так и с проприетарным программным обеспечением. Проект был создан после принятия первой версии стандарта C++ в 1998 году, когда многие разработчики остались недовольный отсутствием необходимых для повседневной работы библиотек в STL. Проект является своего рода «испытательным полигоном» для различных расширений языка и части библиотек, которые являются кандидатами на включение в следующую версию стандарта C++. В Boost

В мире, наверное, не найдется ни одного программиста на С++, который не слышал о Boost. Boost — собрание библиотек классов, использующих функциональность языка C++, и предоставляющих удобный кроссплатформенный высокоуровневый интерфейс для решения различных задач программирования, таких как работа с файлами, потоками, регулярными выражениями, генерацией псевдослучайных чисел, обработкой изображений, модульным тестированием и т. п. Библиотеки распространяется по лицензии Boost Software License, разработанной для того, чтобы Boost можно было использовать как со свободным, так и с проприетарным программным обеспечением. Проект был создан после принятия первой версии стандарта C++ в 1998 году, когда многие разработчики остались недовольный отсутствием необходимых для повседневной работы библиотек в STL.

Проект является своего рода «испытательным полигоном» для различных расширений языка и части библиотек, которые являются кандидатами на включение в следующую версию стандарта C++.

В Boost входит набор библиотек, необходимых для работы с:

  • Алгоритмами
  • Многопоточным программированием
  • Контейнерами
  • Модульным тестированием
  • Структурами данных
  • Функциональными объектами
  • Обобщённым программированием
  • Графами
  • Вводом-выводом
  • Межъязыковой поддержкой
  • Итераторами
  • Математическими и численными алгоритмами
  • Синтаксическим и лексическим разбором
  • Метапрограммированием
  • Умными указателями
  • Обработкой строк

В данной статье я покажу как подключить Boost к своему проекту, используя пакетный менеджер Conan, описанный здесь.

Отправным пунктом, ведущим к решению задачи по установки является сайт https:\\conan.io . После открытия его главной страницы в браузере нажимаем на гиперссылку ConanCenter и в появившемся окне поиска вводим boost и получаем список пакетов, в имени которых содержится искомая строка как показано на следующем скриншоте.

-2

Необходимая нам библиотека появляется в списке результатов первой. Переходим к описанию пакета, активировав элемент списка boost/1.87.0. Нас в первую очередь интересует содержимое conanfile.txt, приведенное в одноименной вкладке.

conanfile.txt

[requires]
boost/1.87.0
[generators]
CMakeDeps
CMakeToolchain
[layout]
cmake_layout

Как говорилось в предыдущей статье, содержимое этой вкладки можно скопировать в свой conanfile.txt за исключением секции [layout] cmake_layout, так как она привносит в процесс сборки библиотеки непонятные ошибки. Без нее все собирается нормально.

Кроме того, нас интересует вкладка Targets, а именно информация о подключении библиотеки в CMakeLists.txt, приведенная под заголовком "A simple use case using the CMake file name and the global target:"

Targets

find_package(Boost REQUIRED)
# ...
target_link_libraries(YOUR_TARGET boost::boost)

В команде find_package после аргумента Boost необходимо указать номер версии 1.87.0 чтобы установить последнюю версию библиотеки. Доступные для установки версии можно посмотреть на вкладке Versions как показано на следующем скрине.

-3

Также необходимо понимать, что многие пакеты, в том числе и Boost, зависят от сторонних библиотек. Эти библиотеки перечислены на вкладке Dependencies:

zlib/1.3.1

bzip2/1.0.8

libbacktrace/cci.20210118

Dependencies (tool requirements)

b2/5.2.1

Перейдем от теории к практике. Создадим тестовую программу, использующую в своей работе библиотеку format, входящую в состав Boost.

Создадим папку для проекта и перейдем в нее. Далее создадим conanfile.txt со следующим содержимым:

[requires]

boost/1.87.0

[generators]

CMakeDeps

CMakeToolchain

Как и ранее, будем использовать CMake. Поэтому создадим в той же директории CMakeLists.txt.

cmake_minimum_required(VERSION 3.11)

project(Hello CXX)

find_package(Boost 1.87.0 REQUIRED)

if(Boost_FOUND)

# Boost найден, добавляем к каталогам заголовочных файлов проекта путь к

# заголовочным файлам Boost

include_directories(${Boost_INCLUDE_DIRS})

endif()

# Linux требует подключения библиотеки pthread для поддержки потоков.

# Следующие две строки подключат эту библиотеку на таких платформах

set(THREADS_PREFER_PTHREAD_FLAG ON)

find_package(Threads REQUIRED)

add_executable(hello src/main.cpp)

target_link_libraries(hello PRIVATE Threads::Threads boost::boost)

Отдельно хочется обратить внимание на команду target_link_libraries, в которой к исполняемому файлу линкуется Boost. В Boost есть библиотеки, весь исходный код которых хранится в заголовочных файлах (header-only библиотеки). Для них линковка не требуется. Достаточно лишь указать пути к таким файлам. Пути хранятся в переменной Boost_INCLUDE_DIRS.

Использование библиотеки сильно упрощается, если в ее исходниках нет единиц трансляции (cpp файлов). Не нужно думать о линковке, о том делать ее статической или динамической, об ABI и других технических проблемах, которые могут возникнуть в процессе сборки.

Для справки, ABI (акроним от application binary interface — «бинарный интерфейс приложения»). В C++ это понятие относится к тому, в каком формате хранятся объектные файлы, выдаваемые компилятором. В частности, от него зависит, как передаются параметры функций, а также расположение в памяти классов и таблиц виртуальных функций, работа распределителей динамической памяти. Части кода, собранные с разными ABI, чаще всего несовместимы между собой.

Кроме header-only библиотек в Boost также есть компилируемые библиотеки, которые нужно линковать к приложению командой target_link_libraries.

Далее создадим директорию src и разместим в ней файл main.cpp, содержащий проверочную программу:

// Подключим библиотеку Boost.Format

#include <boost/format.hpp>

#include <iostream>

int main() {

std::cout << boost::format("writing %1%, version=%2% : date: %3%") % "Hello from boost! " % 1.87 % 30032025 << std::endl;

return 0;

}

Теперь все готово к установке Boost и сборке проекта. Перейдем из папки src в корневую директорию проекта и введем команду:

conan install . --output-folder=./build --build=missing -s build_type=Debug -s compiler.libcxx=libstdc++11

В ней символ . после install задает текущую директорию для поиска файла conanfile.txt. --output-folder=./build задает директорию build для записи вспомогательных файлов сборки проекта. --build=missing указывает на необходимость собирать бинарные файлы только для тех библиотек, которые отсутствуют для текущей операционной системы. Остальные файлы скачиваются из репозитория Conan, уменьшая тем самым время сборки. build_type=Debug задается для того чтобы можно было отлаживать программу с исходниками Boost. И наконец настройка compiler.libcxx=libstdc++11 нужна для того чтобы задать совместимость ABI с версией, используемой в C++ 11 и более поздних.

Работа команды начинается с анализа пакетов, от которых зависит Boost и скачивания их из репозитория Conan.

-4

Далее пакеты устанавливаются в системе.

-5

После этого скачивается и собирается заданная в conanfile.txt версия Boost.

-6

После завершения установки можно переходить к построению программы. Для этого переходим в созданную в процессе сборки папку build и вводим следующую команду:

cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug

В ней указываем вспомогательный conan_toolchain.cmake с информацией об установке Boost. Этот файл также автоматически создается в директории build. Также задаем отладочную сборку.

Завершаем построение проекта командой

cmake --build .

Как видно на скрине ниже, сборка завершилась без ошибок, и запущенная программа выдала ожидаемый результат.

-7

Исходный код проекта можно найти здесь.