Answer the question
In order to leave comments, you need to log in
How to properly organize a modular project using CMake?
I am writing a cross-platform project in C++. Since CMake is the de facto standard for cross-platform solutions, the project uses CMake. I used to add dependencies - third-party libraries - pre-assembling them manually in a separate folder and then copying them to the project structure or transferring third-party sources to the code directly. However, during the next assembly of the next version of the third-party library, I got tired - I decided to organize everything according to my mind, through the package mechanism (FIND_PACKAGE and others like it).
Sketched the desired project structure in the first iteration:
Answer the question
In order to leave comments, you need to log in
Since CMake allows you to get the same result in a bunch of different ways, I will try to describe the approach that I myself would use.
Structure:
packages_test
├── .git
├── cmake // Папка с доп. CMake скриптами если в этом есть необходимость
├── build // Результат сборки
│ └─ res.exe // Исполняемый файл
├── CMakeLists.txt // Конфигурация сборки проекта
├── src
│ ├─ main.cpp // Точка входа, main()
│ └─ ...// Прочие файлы проекта
├── dependencies // Зависимости (подключаются через механизм submodule)
│ ├─ vendor_package_0 // У каждой зависимости своя внутренняя организация
│ └─ vendor_package_1
└── test // Тесты
├── CMakeLists.txt
└── src
└── test_main.cpp
cmake_minimum_required(VERSION 3.0)
project(playrix_project VERSION 1.0 LANGUAGES CXX)
add_executable(playrix src/main.cpp)
# Импортируем наши зависимости. Это не приводит к сборке, но просто позволяет нам использовать target'ы этих проектов.
add_subdirectory(dependencies/vendor_package_0)
add_subdirectory(dependencies/vendor_package_1)
# Забудьте про include_directories и link_directories! В современном CMake следует использовать targets и properties.
# Опредеяем зависимости нашего проекта
target_link_libraries(playrix # Имя нашего executable'а
PRIVATE # Определяет область видимости зависимостей для внешних проектов
vendor_package_0_target # Настоящее имя target'а надо смотреть в vendor_package_0 CMakeLists.txt (add_library)
vendor_package_1_target
)
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question