Представьте, что вы стажер в компании "Formatter Inc.".
Вам поручили перейти на систему автоматизированной сборки CMake.
Исходные файлы находятся в директории formatter_lib.
В этой директории находятся файлы для статической библиотеки formatter.
Создайте CMakeList.txt
в директории formatter_lib,
с помощью которого можно будет собирать статическую библиотеку formatter.
$ git clone https://github.com/dankokin/lab03
$ cd lab03
$ cd formatter_lib
$ cat >> CMakeLists.txt << EOF
> EOF
$ nano CMakeLists.txt
cmake_minimum_required(VERSION 3.4)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(formatter)
set(SOURCES formatter.cpp)
set(HEADERS formatter.h)
add_library(formatter ${SOURCES} ${HEADERS})
target_include_directories(formatter PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
У компании "Formatter Inc." есть перспективная библиотека,
которая является расширением предыдущей библиотеки. Т.к. вы уже овладели
навыком созданием CMakeList.txt
для статической библиотеки formatter, ваш
руководитель поручает заняться созданием CMakeList.txt
для библиотеки
formatter_ex, которая в свою очередь использует библиотеку formatter.
$ cd ..
$ cd formatter_ex_lib
$ cat >> CMakeLists.txt << EOF
> EOF
$ nano CMakeLists.txt
cmake_minimum_required(VERSION 3.4)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(formatter_ex)
add_library(formatter_ex STATIC formatter_ex.cpp)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../formatter_lib ${CMAKE_CURRENT_SOURCE_DIR}/formatter)
target_include_directories(formatter_ex PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(formatter_ex formatter)
Конечно же ваша компания предоставляет примеры использования своих библиотек.
Чтобы продемонстрировать как работать с библиотекой formatter_ex,
вам необходимо создать два CMakeList.txt
для двух простых приложений:
- hello_world, которое использует библиотеку formatter_ex;
- solver, приложение которое испольует статические библиотеки formatter_ex и solver_lib.
Hello_World:
$ cd ..
$ cd hello_world_application
$ cat >> CMakeLists.txt << EOF
> EOF
$ nano CMakeLists.txt
cmake_minimum_required(VERSION 3.4)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(hello_world)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../formatter_ex_lib ${CMAKE_CURRENT_SOURCE_DIR}/formatter_ex)
add_executable(sources ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(sources formatter_ex)
solver_lib:
$ cd ..
$ cd solver_lib
$ cat >> CMakeLists.txt << EOF
> EOF
$ nano CMakeLists.txt
cmake_minimum_required(VERSION 3.4)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(solver_lib)
add_library(solver_lib STATIC solver.cpp)
target_include_directories(solver_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
solver_application:
$ cd ..
$ cd solver_application
$ cat >> CMakeLists.txt << EOF
> EOF
$ nano CMakeLists.txt
Aналогично, только библиотек уже 2:
cmake_minimum_required(VERSION 3.4)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(solver)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../solver_lib ${CMAKE_CURRENT_SOURCE_DIR}/solver_lib)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../formatter_ex_lib ${CMAKE_CURRENT_SOURCE_DIR}/formatter_ex)
add_executable(source equation.cpp)
target_link_libraries(source solver_lib)
target_link_libraries(source formatter_ex)
Удачной стажировки!
- Основы сборки проектов на С/C++ при помощи CMake
- CMake Tutorial
- C++ Tutorial - make & CMake
- Autotools
- CMake
Copyright (c) 2015-2019 The ISC Authors