Интеграция Boost в Qt-проект с использованием CMake

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

Архитектурная

  • GUI — Qt Widgets или QML
  • бизнес-логика — отдельные модули
  • сетевой слой / файловая система / алгоритмы — Boost
  • сборка — CMake ≥ 3.21
  • Qt6

Ключевой принцип:
никаких глобальных include_directories, только target-based linking.

Структура проекта

QtBoostApp/
├── CMakeLists.txt
├── src/
│   ├── main.cpp
│   ├── MainWindow.h
│   ├── MainWindow.cpp
│   └── backend/
│       ├── FileService.h
│       └── FileService.cpp

Пример использования Boost внутри Qt

Будем использовать:

  • Boost.Filesystem
  • Boost.System

FileService.h

#pragma once
#include <QString>

class FileService
{
public:
    static QString currentDirectory();
};

FileService.cpp

#include "FileService.h"
#include <boost/filesystem.hpp>

QString FileService::currentDirectory()
{
    boost::filesystem::path p(".");
    auto absPath = boost::filesystem::absolute(p);
    return QString::fromStdString(absPath.string());
}

MainWindow.h

#pragma once

#include <QMainWindow>

class QLabel;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget* parent = nullptr);

private:
    QLabel* label;
};

MainWindow.cpp

#include "MainWindow.h"
#include "backend/FileService.h"

#include <QLabel>

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
{
    label = new QLabel(FileService::currentDirectory(), this);
    setCentralWidget(label);
    resize(500, 200);
}

main.cpp

#include <QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow w;
    w.show();
    return app.exec();
}

CMakeLists.txt (Qt6 + Boost)

cmake_minimum_required(VERSION 3.21)
project(QtBoostApp LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Включаем автоматическую обработку moc/uic/rcc
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

# --- Qt ---
find_package(Qt6 REQUIRED COMPONENTS Widgets)

# --- Boost ---
set(Boost_USE_STATIC_LIBS OFF)      # или ON
set(Boost_USE_MULTITHREADED ON)

find_package(Boost 1.70 REQUIRED COMPONENTS filesystem system)

# --- Executable ---
add_executable(QtBoostApp
    src/main.cpp
    src/MainWindow.cpp
    src/MainWindow.h
    src/backend/FileService.cpp
    src/backend/FileService.h
)

# --- Linking ---
target_link_libraries(QtBoostApp
    PRIVATE
        Qt6::Widgets
        Boost::filesystem
        Boost::system
)

# Windows-specific (если требуется)
if (WIN32)
    set_target_properties(QtBoostApp PROPERTIES WIN32_EXECUTABLE TRUE)
endif()

Что происходит на уровне CMake

Qt6::Widgets

  • Добавляет include directories
  • Добавляет Qt6Core, Qt6Gui транзитивно
  • Подключает Qt runtime

Boost::filesystem

  • Добавляет include Boost
  • Добавляет Boost::system транзитивно
  • Корректно подключает бинарную библиотеку

Это и есть target-based dependency graph.

Интеграция через vcpkg

Установка:

vcpkg install qt6-base boost-filesystem

Сборка:

cmake -B build -S . \
  -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg.cmake

CMakeLists.txt не меняется.

Преимущество:

  • Совместимость ABI
  • Автоматическая сборка Boost под тот же компилятор
  • Нет конфликтов версий

Boost + Qt Signals/Slots

Boost не конфликтует с MOC, если:

  • Заголовки Boost не содержат Q_OBJECT
  • Не происходит макро-конфликтов

Иногда нужно:

#define BOOST_BIND_GLOBAL_PLACEHOLDERS

Частые проблемы

Undefined reference to boost::filesystem

Причина:

  • Не добавлен компонент system
  • Статическая линковка без правильных флагов

Проверка:

cmake --build build --verbose

Конфликт std::filesystem и boost::filesystem

Решение:

  • Использовать alias:
namespace fs = boost::filesystem;

или перейти на std::filesystem (если нет legacy-кода).

Статическая сборка Boost на Windows

Перед find_package:

set(Boost_USE_STATIC_LIBS ON)
add_definitions(-DBOOST_ALL_NO_LIB)