Архитектурная
- 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)
