Понедельник, 25.08.2025 19:00

Установка статической библиотеки С++ с помощью CMake. Библиотеки С++ и CMake. Часть 2

Установка статической библиотеки С++ с помощью 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\colorconsolelib
cmake --install build --prefix=C:\msys64\mingw64
C:\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\colorconsole
code .

Внесем изменения в файл 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) библиотеки и использование её в нашем проекте.

Категория C++
Теги Cpp CMAKE

Добавить комментарий

Простой текст

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Просмотров: 309