CMake и библиотека Boost: интеграция в C++-проект

Автор: | 11 февраля, 2026

Введение

Boost — одна из наиболее масштабных и зрелых библиотек для C++, предоставляющая компоненты от метапрограммирования и многопоточности до сетевого взаимодействия и сериализации. Многие части Boost легли в основу стандартной библиотеки C++ (smart pointers, filesystem, thread, chrono и др.).

CMake — де-факто стандарт для кроссплатформенной сборки C++-проектов. Современная модель CMake (target-based approach) позволяет корректно описывать зависимости, интерфейсы и транзитивные свойства библиотек.

Способы подключения Boost в CMake

Существует три основных сценария:

СценарийКогда использовать
System BoostBoost установлен в системе
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-onlyalgorithm, optional, variantТолько Boost::boost
Compiledfilesystem, regex, threadТребует COMPONENTS

Boost.Asio — частично header-only, но может требовать Boost.System.

Диагностика проблем

Проблема: Boost не найден

Could NOT find Boost

Решения:

  1. Указать BOOST_ROOT: cmake -DBOOST_ROOT=/path/to/boost
  2. Проверить CMAKE_PREFIX_PATH: -DCMAKE_PREFIX_PATH=/path/to/boost
  3. Проверить версию: 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.