Представьте, что вы стажер в компании "Formatter Inc.".
Вам поручили перейти на систему автоматизированной сборки CMake.
Исходные файлы находятся в директории formatter_lib.
В этой директории находятся файлы для статической библиотеки formatter.
Создайте CMakeList.txt
в директории formatter_lib,
с помощью которого можно будет собирать статическую библиотеку formatter.
Всё, что от нас требуется — это написать CMakeLists.txt.
Создаём в директории
formatter_lib
файл с названиемCMakeLists.txt
Приведу готовый файл:
cmake_minimum_required(VERSION 3.4) project(formatter_lib) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Выше - стандартная фигня, она везде будет одинаковой, кроме имени проекта. add_library(formatter_lib STATIC ${CMAKE_CURRENT_SOURCE_DIR}/formatter.cpp) # Добавляем таргет-статичную библиотеку formatter_lib из файла с кодом formatter.cppПроверим, что проект собирается. Для этого в директории
formatter_lib
введём команды:$ cmake -B build $ cmake --build buildПоследней строкой консоль должна выдать
[100%] Built target formatter_lib
У компании "Formatter Inc." есть перспективная библиотека,
которая является расширением предыдущей библиотеки. Т.к. вы уже овладели
навыком созданием CMakeList.txt
для статической библиотеки formatter, ваш
руководитель поручает заняться созданием CMakeList.txt
для библиотеки
formatter_ex, которая в свою очередь использует библиотеку formatter.
Аналогично, создаём
CMakeLists.txt
в папкеformatter_ex_lib
:cmake_minimum_required(VERSION 3.4) project(formatter_ex_lib) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../formatter_lib formatter_lib_dir) # Собираем то, что лежит в formatter_lib и пихаем это в папочку formatter_lib_dir add_library(formatter_ex_lib STATIC ${CMAKE_CURRENT_SOURCE_DIR}/formatter_ex.cpp) # Добавляем статичную библиотеку formatter_ex_lib из файла formatter_ex.cpp target_include_directories(formatter_ex_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../formatter_lib ) # Открываем таргету formatter_ex_lib доступ к директории formatter_lib target_link_libraries(formatter_ex_lib formatter_lib) # Привязываем библиотеку formatter_lib к библиотеке formatter_ex_lib.
$ cmake -B build $ cmake --build build
Конечно же ваша компания предоставляет примеры использования своих библиотек.
Чтобы продемонстрировать как работать с библиотекой formatter_ex,
вам необходимо создать два CMakeList.txt
для двух простых приложений:
- hello_world, которое использует библиотеку formatter_ex;
Директория
hello_world_application
, файлCMakeLists.txt
:cmake_minimum_required(VERSION 3.4) project(hello_world) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../formatter_ex_lib formatter_ex_lib_dir) add_executable(hello_world ${CMAKE_CURRENT_SOURCE_DIR}/hello_world.cpp) # На этот раз вместо библиотеки создаём исполняемый файл. Синтаксис тот же. target_include_directories(hello_world PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../formatter_ex_lib ) target_link_libraries(hello_world formatter_ex_lib) # Привязываем к таргету hello_world библиотеку formatter_ex_libСборка:
$ cmake -B build $ cmake --build buildТеперь можно проверить, что всё работает как надо.
В папке
build
появится исполняемый файлhello_world
. Запустим его:$ build/hello_world
solver, приложение которое испольует статические библиотеки formatter_ex и solver_lib.
Сначала соберём библиотеку
solver_lib
.
#include "solver.h"
#include #include
void solve(float a, float b, float c, float& x1, float& x2) { float d = (b * b) - (4 * a * c);
if (d < 0) { throw std::logic_error{"error: discriminant < 0"}; } x1 = (-b - sqrtf(d)) / (2 * a); x2 = (-b + sqrtf(d)) / (2 * a);
}
Далее соберём библиотеку. Директория `solver_lib`, файл `CMakeLists.txt`: ```cmake cmake_minimum_required(VERSION 3.4) project(solver_lib) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_library(solver_lib ${CMAKE_CURRENT_SOURCE_DIR}/solver.cpp)
Директория
solver_application
, файлCMakeLists.txt
:cmake_minimum_required(VERSION 3.4) project(solver) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../formatter_ex_lib formatter_ex_lib_dir) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../solver_lib solver_lib_dir) add_executable(solver ${CMAKE_CURRENT_SOURCE_DIR}/equation.cpp) target_include_directories(formatter_ex_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../formatter_ex_lib ${CMAKE_CURRENT_SOURCE_DIR}/../solver_lib ) target_link_libraries(solver formatter_ex_lib solver_lib)K таргету
solver
подключаются две библиотеки.Сборка:
$ cmake -B build $ cmake --build buildПроверим, что всё работает:
$ build/solverОт нас потребуется ввести три числа — коэффициенты квадратного уравнения. На выходе получим решение уравнения.
Удачной стажировки!
- Основы сборки проектов на С/C++ при помощи CMake
- CMake Tutorial
- C++ Tutorial - make & CMake
- Autotools
- CMake
Copyright (c) 2015-2021 The ISC Authors