Введение
Boost — одна из наиболее масштабных и зрелых библиотек для C++, предоставляющая компоненты от метапрограммирования и многопоточности до сетевого взаимодействия и сериализации. Многие части Boost легли в основу стандартной библиотеки C++ (smart pointers, filesystem, thread, chrono и др.).
CMake — де-факто стандарт для кроссплатформенной сборки C++-проектов. Современная модель CMake (target-based approach) позволяет корректно описывать зависимости, интерфейсы и транзитивные свойства библиотек.
Способы подключения Boost в CMake
Существует три основных сценария:
| Сценарий | Когда использовать |
|---|---|
| System Boost | Boost установлен в системе |
| Boost через vcpkg / Conan | Управляемые зависимости |
| FetchContent / ExternalProject | Локальная сборка Boost |
Минимальный пример проекта
Структура:
boost_example/
├── CMakeLists.txt
└── src/
└── main.cpp
main.cpp
#include <boost/algorithm/string.hpp>
#include <iostream>
#include <vector>
int main() {
std::string text = "CMake and Boost integration example";
std::vector<std::string> tokens;
boost::split(tokens, text, boost::is_space());
for (const auto& token : tokens) {
std::cout << token << std::endl;
}
return 0;
}
CMake с Boost
CMakeLists.txt
cmake_minimum_required(VERSION 3.16) project(BoostExample LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Поиск Boost find_package(Boost 1.70 REQUIRED COMPONENTS) add_executable(boost_example src/main.cpp) # Для header-only библиотек target_link_libraries(boost_example PRIVATE Boost::boost)
Пояснение
find_package(Boost REQUIRED)— находит установленный Boost.Boost::boost— интерфейсная цель для header-only библиотек.- Компоненты указываются, если требуется бинарная часть (filesystem, system и др.).
Работа с компонентами Boost (filesystem, system)
#include <boost/filesystem.hpp>
#include <iostream>
int main() {
boost::filesystem::path p(".");
std::cout << boost::filesystem::absolute(p) << std::endl;
}
Тогда CMake будет выглядеть так:
find_package(Boost 1.70 REQUIRED COMPONENTS filesystem system)
add_executable(boost_example src/main.cpp)
target_link_libraries(boost_example
PRIVATE
Boost::filesystem
Boost::system
)
Важно
Boost.Filesystem зависит от Boost.System. Современный CMake корректно обрабатывает транзитивные зависимости.
Использование Boost через vcpkg
Если проект использует vcpkg:
vcpkg install boost
И сборка:
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg.cmake
CMakeLists.txt остается тем же:
find_package(Boost REQUIRED COMPONENTS filesystem) target_link_libraries(boost_example PRIVATE Boost::filesystem)
vcpkg автоматически зарегистрирует конфигурационные файлы BoostConfig.cmake.
Header-only vs Compiled Boost
| Тип | Примеры | Особенности |
|---|---|---|
| Header-only | algorithm, optional, variant | Только Boost::boost |
| Compiled | filesystem, regex, thread | Требует COMPONENTS |
Boost.Asio — частично header-only, но может требовать Boost.System.
Диагностика проблем
Проблема: Boost не найден
Could NOT find Boost
Решения:
- Указать BOOST_ROOT:
cmake -DBOOST_ROOT=/path/to/boost - Проверить CMAKE_PREFIX_PATH:
-DCMAKE_PREFIX_PATH=/path/to/boost - Проверить версию:
find_package(Boost 1.81 EXACT REQUIRED)
Legacy-подход (не рекомендуется)
Ранее использовалось:
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(app ${Boost_LIBRARIES})
Этот подход:
- загрязняет глобальное пространство include
- ломает инкапсуляцию
- плохо работает с транзитивными зависимостями
Современный CMake требует target-based линковки.
Статическая vs динамическая сборка Boost
По умолчанию CMake использует системные настройки.
Можно управлять:
set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME OFF)
Важно задавать эти переменные до вызова find_package.
