Установка статической библиотеки С++ с помощью CMake. Библиотеки С++ и CMake. Часть 2
Статическая библиотека C++ может располагаться не только в корне нашего проекта, но и в любом другом месте, хотя чаще всего их устанавливают в специально выделенные для этого папки. В прошлой статье мы создали библиотеку C++ на основе CMake проекта C++.
Сегодня мы установим библиотеку в отдельную папку и будем использовать только заголовочный файл и файл библиотеки для сборки нашей программы.
Модернизация библиотеки C++ для автоматической настройки c CMake
Откроем папку с нашей библиотекой:
cd C:\projects\colorconsolelibДля правильной сборки проекта из отдельной папки нам нужен файл:
Откроем файл:
C:\projects\colorconsolelib\cmake\colorconsole-config.cmake.inИзменим содержимое на:
# CMake package config file for colorconsole library.
#
# The following target is imported:
#
# ccon:colorconsole
#
# Запускаем инициализацию
@PACKAGE_INIT@
#Устанавливаем тип библиотеки - статическая
set(type "static")
# Указываем включить файл конфигурации созданный в основном файле CMakeLists.txt
include("${CMAKE_CURRENT_LIST_DIR}/colorconsole-${type}-targets.cmake")
# Проверяем что все требуемые компоненты найдены
check_required_components(colorconsole)
# Выводим строку при конфигурировании проекта использующего наше библиотеку
message("-- Found ${type} colorconsole (version ${colorconsole_VERSION})")Строка в конце не влияет на настройку проекта, но при конфигурировании выводит сообщение:
-- Found static colorconsole (version 0.1.0)В строке:
${colorconsole_VERSION} вы можете вместо:
colorconsole использовать:
${CMAKE_FIND_PACKAGE_NAME}Но из за ограничений хостинга пришлось написать так.
Файл colorconsole-config.cmake.in не используется нашей библиотекой. При подключении библиотеки к другому проекту, CMAKE использует инструкции из этого файла, для дополнительной настройки. В нашем случае мы указываем, что нужно использовать файл с настройками:
colorconsole-static-targets.cmakeЭтот файл создается благодаря инструкциям в основном файле CMakeLists.txt автоматически и содержит инструкции о том, какие дополнительные настройки необходимо произвести, чтобы собрать проект с нашей библиотекой.
Запустим конфигурирование и сборку:
cmake -S . -B build
cmake --build buildЕсли мы сейчас откроем файл:
C:\projects\libcolorconsole\lib\cmake\colorconsole\colorconsole-config.cmakeТо обнаружим, помимо кода, автоматически добавленного CMake код из файла:
colorconsole-config.cmake.inЗапустим установку:
cmake --install build --prefix=C:\projects\libcolorconsole-- Install configuration: "Debug"
-- Installing: C:\projects\libcolorconsole/lib/libcolorconsole.a
-- Installing: C:\projects\libcolorconsole/include
-- Installing: C:\projects\libcolorconsole/include/colorconsole.h
-- Installing: C:\projects\libcolorconsole/lib/cmake/colorconsole/colorconsole-static-targets.cmake
-- Installing: C:\projects\libcolorconsole/lib/cmake/colorconsole/colorconsole-static-targets-debug.cmake
-- Installing: C:\projects\libcolorconsole/lib/cmake/colorconsole/colorconsole-config.cmake
-- Installing: C:\projects\libcolorconsole/lib/cmake/colorconsole/colorconsole-config-version.cmakeЗдесь параметр:
--prefix=C:\projects\libcolorconsoleУказывает CMake что нужно установить библиотеку в папку:
C:\projects\libcolorconsoleВ неё будут скопированы все файлы, что могут потребоваться для сборки нашего проекта с библиотекой libcolorconsole.
В результате у нас получится:
tree /F libcolorconsole
Структура папок
C:\PROJECTS\LIBCOLORCONSOLE
├───include
│ colorconsole.h
│
└───lib
│ libcolorconsole.a
│
└───cmake
└───colorconsole
colorconsole-config-version.cmake
colorconsole-config.cmake
colorconsole-static-targets-debug.cmake
colorconsole-static-targets-release.cmake
colorconsole-static-targets.cmakeКак видите, помимо самой библиотеки и заголовочного файла:
lib/libcolorconsole.a
include/colorconsole.hУ нас были скопированы скрипты CMake позволяющие автоматизировать процесс включения библиотеки в проект:
lib/cmake/colorconsole/colorconsole-static-targets.cmake
lib/cmake/colorconsole/colorconsole-static-targets-debug.cmake
lib/cmake/colorconsole/colorconsole-config.cmake
lib/cmake/colorconsole/colorconsole-config-version.cmakeДобавляем статическую библиотеку из папки в наш проект
Откроем папку с проектом:
cd c:\projects\colorconsoleУдалим папку lib:
rmdir /S /Q libЗапустим VSCode:
code .Внесем изменения в CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(colorconsoleapp VERSION 0.1 LANGUAGES CXX)
list(APPEND CMAKE_PREFIX_PATH "../libcolorconsole/lib/cmake/colorconsole")
find_package(colorconsole CONFIG REQUIRED)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(${PROJECT_NAME})
target_sources(${PROJECT_NAME}
PRIVATE
main.cpp
)
include(GNUInstallDirs)
target_include_directories(${PROJECT_NAME} PUBLIC "../libcolorconsole/lib/cmake/colorconsole")
target_link_libraries(${PROJECT_NAME} ccon::colorconsole)Запустим конфигурирование и сборку:
cmake -S . -B build
cmake --build buildЗапустим:
.\build\colorconsole.exeВсё работает как и ожидалось.
Таким образом, нам не нужно беспокоиться о настройках для компилятора и линковщика, и указывать пути к дополнительным файлам и библиотекам, CMake всё делает автоматически, всё что мы указали это путь к папке со скриптами CMake:
list(APPEND CMAKE_PREFIX_PATH "../libcolorconsole/lib/cmake/colorconsole")И путь к папке с заголовочными файлами:
target_include_directories(${PROJECT_NAME} PUBLIC "../libcolorconsole/lib/cmake/colorconsole")Установка библиотеки в системные папки
В системах Linux существуют специальные папки для хранения библиотек и заголовочных файлов.
В Debian это:
/usr/libА заголовочные файлы вы можете найти в:
/usr/includeВ Windows в Msys2 для библиотек:
C:\msys64\mingw64\lib\Для заголовочных файлов:
C:\msys64\mingw64\include\Так как эти папки уже известны компилятору и линковщику, как папки в которых нужно в первую очередь искать нужные файлы, то мы можем установить нашу библиотеку в них, тогда любой проект, который будет собираться в будущем на данном ПК, сможет без проблем использовать нашу библиотеку для сборки.
Обратите внимание, под Windows мы всегда используем префикс, так как в противном случае мы можем получить такой результат:
cmake --install build
-- Install configuration: "Release"
CMake Error at build/cmake_install.cmake:41 (file):
file cannot create directory: C:/Program Files (x86)/colorconsole/lib.
Maybe need administrative privileges.В данном случае я специально запустил установку от пользователя без прав администратора.
Как видите. По умолчанию под Windows библиотека будет устанавливаться в папку:
C:/Program Files (x86)/colorconsole/libНам это не нужно, поэтому мы и указываем префикс.
Установим нашу библиотеку в папки Msys2, для этого запустим из папки с библиотекой:
cd C:\projects\colorconsolelibcmake --install build --prefix=C:\msys64\mingw64C:\projects\colorconsolelib>cmake --install build --prefix=C:\msys64\mingw64
-- Install configuration: "Release"
-- Installing: C:\msys64\mingw64/lib/libcolorconsole.a
-- Installing: C:\msys64\mingw64/include
-- Installing: C:\msys64\mingw64/include/colorconsole.h
-- Installing: C:\msys64\mingw64/lib/cmake/colorconsole/colorconsole-static-targets.cmake
-- Installing: C:\msys64\mingw64/lib/cmake/colorconsole/colorconsole-static-targets-release.cmake
-- Installing: C:\msys64\mingw64/lib/cmake/colorconsole/colorconsole-config.cmake
-- Installing: C:\msys64\mingw64/lib/cmake/colorconsole/colorconsole-config-version.cmakeНаша библиотека успешно установлена.
Вернемся к нашему проекту:
cd C:\projects\colorconsolecode .Внесем изменения в файл CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(colorconsoleapp VERSION 0.1 LANGUAGES CXX)
find_package(colorconsole CONFIG REQUIRED)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(${PROJECT_NAME})
target_sources(${PROJECT_NAME}
PRIVATE
main.cpp
)
include(GNUInstallDirs)
target_link_libraries(${PROJECT_NAME} ccon::colorconsole)Обратите внимание, мы удалили строки:
list(APPEND CMAKE_PREFIX_PATH "../libcolorconsole/lib/cmake/colorconsole")
target_include_directories(${PROJECT_NAME} PUBLIC "../libcolorconsole/lib/cmake/colorconsole")Запустим конфигурирование:
cmake -S . -B build-- Found static colorconsole (version 0.1.0)
-- Configuring done (0.6s)
-- Generating done (0.0s)
-- Build files have been written to: C:/projects/colorconsole/build
Строка:
-- Found static colorconsole (version 0.1.0) Показывает, что CMake автоматически нашел и подключил нашу библиотеку, для этого теперь достаточно строки:
find_package(colorconsole CONFIG REQUIRED)Запустим сборку:
cmake --build build[ 50%] Building CXX object CMakeFiles/colorconsoleapp.dir/main.cpp.obj
[100%] Linking CXX executable colorconsoleapp.exe
[100%] Built target colorconsoleappСборка прошла успешно.
Запустим:
.\build\colorconsole.exeПрограмма успешно отработала.
Заключение
Сегодня мы рассмотрели установку статической библиотеки C++ в отдельную папку и в системную папку Msys2:
Доработали проект библиотеки, добавив настройки для сборки в файл colorconsole-config.cmake.in;
Собрали проект библиотеки и использовали CMake чтобы установить библиотеку в отдельную папку;
Добавили библиотеку из этой папки в свой проект;
Собрали наш проект с внешней библиотекой и убедились, что всё работает корректно;
Рассмотрели системные папки, в которые можно установить библиотеки в Linux и Msys2;
Установили библиотеку, в качестве префикса использовав C:\msys64\mingw64;
Внесли изменения в файл нашего проекта CMakeLists.txt, чтобы использовать библиотеку из системной папки;
Собрали и запустили проект, чтобы убедиться, что все работает как нужно.
В следующей статье мы рассмотрим создание динамической или разделяемой(shared) библиотеки и использование её в нашем проекте.
Добавить комментарий