В мире, наверное, не найдется ни одного программиста на С++, который не слышал о Boost. Boost — собрание библиотек классов, использующих функциональность языка C++, и предоставляющих удобный кроссплатформенный высокоуровневый интерфейс для решения различных задач программирования, таких как работа с файлами, потоками, регулярными выражениями, генерацией псевдослучайных чисел, обработкой изображений, модульным тестированием и т. п. Библиотеки распространяется по лицензии Boost Software License, разработанной для того, чтобы Boost можно было использовать как со свободным, так и с проприетарным программным обеспечением. Проект был создан после принятия первой версии стандарта C++ в 1998 году, когда многие разработчики остались недовольный отсутствием необходимых для повседневной работы библиотек в STL.
Проект является своего рода «испытательным полигоном» для различных расширений языка и части библиотек, которые являются кандидатами на включение в следующую версию стандарта C++.
В Boost входит набор библиотек, необходимых для работы с:
- Алгоритмами
- Многопоточным программированием
- Контейнерами
- Модульным тестированием
- Структурами данных
- Функциональными объектами
- Обобщённым программированием
- Графами
- Вводом-выводом
- Межъязыковой поддержкой
- Итераторами
- Математическими и численными алгоритмами
- Синтаксическим и лексическим разбором
- Метапрограммированием
- Умными указателями
- Обработкой строк
В данной статье я покажу как подключить Boost к своему проекту, используя пакетный менеджер Conan, описанный здесь.
Отправным пунктом, ведущим к решению задачи по установки является сайт https:\\conan.io . После открытия его главной страницы в браузере нажимаем на гиперссылку ConanCenter и в появившемся окне поиска вводим boost и получаем список пакетов, в имени которых содержится искомая строка как показано на следующем скриншоте.
Необходимая нам библиотека появляется в списке результатов первой. Переходим к описанию пакета, активировав элемент списка 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 как показано на следующем скрине.
Также необходимо понимать, что многие пакеты, в том числе и 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.
Далее пакеты устанавливаются в системе.
После этого скачивается и собирается заданная в conanfile.txt версия Boost.
После завершения установки можно переходить к построению программы. Для этого переходим в созданную в процессе сборки папку build и вводим следующую команду:
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug
В ней указываем вспомогательный conan_toolchain.cmake с информацией об установке Boost. Этот файл также автоматически создается в директории build. Также задаем отладочную сборку.
Завершаем построение проекта командой
cmake --build .
Как видно на скрине ниже, сборка завершилась без ошибок, и запущенная программа выдала ожидаемый результат.
Исходный код проекта можно найти здесь.