Вторник, 09.09.2025 19:00

Используем в проекте библиотеку С++ из git-репозитория

Используем в проекте библиотеку С++ из git-репозитория

Если вы часто используете одну и туже библиотеку в своих проектах, то лучший способ получать исходный код – использовать git-репозиторий. 

Сегодня мы создадим новый проект CMake и настроим его на получение кода библиотеки C++ из git-репозитория.

Для чего нужно использовать git-репозиторий? На это есть несколько причин:

- Автоматическая загрузка и подключение библиотеки к нашему проекту;

- Одна точка получения кода, а значит не будет проблем с обновлением самой библиотеки;

- Нет необходимости в ручном обновлении библиотеки в каждом проекте, достаточно запустить реконфигурацию;

- Обновление зависимостей. Библиотека может требовать наличия дополнительных библиотек и не все они могут быть установлены в системе или совпадать по версии с системными, но тут стоит отметить, что сама библиотека должна поддерживать установку таких библиотек из git-репозитория. Для управления зависимостями есть другие инструменты, но вам может хватить и такого подхода.

При всем этом, не обязательно обновляться из официального git-репозитория. Можно установить и локальный сервер, я рекомендую Gitea - https://github.com/go-gitea/gitea

Для этой статьи я приготовил git-репозиторий с нашей библиотекой ColorConsole - https://gitflic.ru/project/vasiliyaltunin/color-console-library

Его мы и будем использовать для получения исходного кода.

Создание проекта

Создадим новый проект

cd c:\projects
mkdir colorconsole_libgit
cd colorconsole_libgit
type nul > main.cpp
type nul > CMakeLists.txt

Добавим содержимое для файла main.cpp:

#include <iostream>

#include "colorconsole/colorconsole.h"

using ccon::ColorConsole;

int main(int argc, char *argv[])
{
   ColorConsole::init();

   ColorConsole::setConsStdOutDefColor();

   ColorConsole::emptyLine(); 

    for (int i = 0; i < 256; i++)

    {
        if ((i % 16 == 0) && (i != 0)) {

           ColorConsole::emptyLine();
        }
       ColorConsole::setConsStdOutColor(i);
       printf("[%03d]",i);
    }

   ColorConsole::emptyLine();

    return 0;
}

Добавим содержимое для файла CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)

project(colorconsoleapp VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)


# Собираем исключительно статическую версию программы и библиотеки 
set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "Build using shared libraries ON/OFF")

# Подключаем модуль FetchContent
include(FetchContent)

# Отключаем тихий режим работы FetchContent
set(FETCHCONTENT_QUIET FALSE)

# Задаем настройки для загрузки из git-репозитория
FetchContent_Declare(
  colorconsole  # Имя target нашей библиотеки, должно совпадать с используемым далее 
  GIT_REPOSITORY https://gitflic.ru/project/vasiliyaltunin/color-console-library.git # Путь до репозитория
  GIT_SHALLOW TRUE # Загружаем только последние коммиты
  GIT_PROGRESS TRUE # Отображаем процесс загрузки
  USES_TERMINAL_DOWNLOAD TRUE # Отображать прогресс в терминале (только для Ninja)
  SYSTEM
)

# Запускаем загрузку из git-репозитория и подключение библиотеки
FetchContent_MakeAvailable(colorconsole)


add_executable(${PROJECT_NAME})

target_sources(${PROJECT_NAME}
    PRIVATE
        main.cpp       
)

include(GNUInstallDirs)

target_link_libraries(${PROJECT_NAME} PRIVATE ccon::colorconsole)

message(BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS})

Тут всё должно быть понятно из комментариев.

Обратите внимание! Мы использовали:

set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "Build using shared libraries ON/OFF")

Чтобы установить флаг сборки BUILD_SHARED_LIBS таким образом, чтобы он был установлен и для загружаемой библиотеки!

Запустим конфигурирование:

cmake -S . -B build
-- Building for: Ninja
-- The CXX compiler identification is GNU 15.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/msys64/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Populating colorconsole
-- Configuring done (0.3s)
-- Generating done (0.1s)
-- Build files have been written to: C:/projects/colorconsole_libgit/build/_deps/colorconsole-subbuild
[1/9] Creating directories for 'colorconsole-populate'
[1/9] Performing download step (git clone) for 'colorconsole-populate'
Cloning into 'colorconsole-src'...
remote: Counting objects: 193, done
remote: Finding sources: 100% (193/193)
remote: Getting sizes: 100% (147/147)
remote: Compressing objects: 100% (5596/5596)
remote: Total 193 (delta 45), reused 191 (delta 45)        s
Receiving objects: 100% (193/193), 568.08 KiB | 402.00 KiB/s, done.
Resolving deltas: 100% (45/45), done.
Already on 'master'
Your branch is up to date with 'origin/master'.
[2/9] Performing update step for 'colorconsole-populate'
-- Fetching latest from the remote origin
[3/9] No patch step for 'colorconsole-populate'
[5/9] No configure step for 'colorconsole-populate'
[6/9] No build step for 'colorconsole-populate'
[7/9] No install step for 'colorconsole-populate'
[8/9] No test step for 'colorconsole-populate'
[9/9] Completed 'colorconsole-populate'
BUILD_SHARED_LIBS=OFF
 === Library build set to STATIC
 === Settings setup complete
     Library will be build as STATIC
 === Building EXTERNAL docs
 === Doxygen config generated
 === Libconf settings complete
-- Found Doxygen: C:/msys64/mingw64/bin/doxygen.exe (found version "1.14.0") found components: doxygen dot
 === Documentation setup complete
 === Targets settings complete
 === Install settings complete
BUILD_SHARED_LIBS=OFF
-- Configuring done (20.5s)
-- Generating done (0.2s)
-- Build files have been written to: C:/projects/colorconsole_libgit/build

В процессе конфигурирования нашего проекта, был загружен проект CMake с библиотекой из git-репозитория и было запущено его конфигурирование!

Запустим сборку:

cmake --build build
[4/4] Linking CXX executable colorconsoleapp.exe

Проверим:

ldd .\build\colorconsoleapp.exe
        ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x7ff81b290000)
        KERNEL32.DLL => /c/Windows/System32/KERNEL32.DLL (0x7ff81a0e0000)
        KERNELBASE.dll => /c/Windows/System32/KERNELBASE.dll (0x7ff818b50000)
        msvcrt.dll => /c/Windows/System32/msvcrt.dll (0x7ff819600000)
       libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x7ffff1cb0000)
       libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x7ff808f20000)
       libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x7ff809140000)

У нас собралась статическая версия.

Запустим:

.\build\colorconsoleapp.exe

Все работает.

Сборка с разделяемой (shared) библиотекой

Для сборки с разделяемой (shared) версией библиотеки изменим строку в файле CMakeLists.txt на:

set(BUILD_SHARED_LIBS ON CACHE INTERNAL "Build using shared libraries ON/OFF")

Мы указали – ON

Запустим конфигурирование:

cmake -S . -B build
-- Building for: Ninja
-- The CXX compiler identification is GNU 15.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/msys64/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Populating colorconsole
-- Configuring done (0.3s)
-- Generating done (0.1s)
-- Build files have been written to: C:/projects/colorconsole_libgit/build/_deps/colorconsole-subbuild
[1/9] Creating directories for 'colorconsole-populate'
[1/9] Performing download step (git clone) for 'colorconsole-populate'
Cloning into 'colorconsole-src'...
remote: Counting objects: 193, done
remote: Finding sources: 100% (193/193)
remote: Getting sizes: 100% (147/147)
remote: Compressing objects: 100% (5596/5596)
remote: Total 193 (delta 45), reused 191 (delta 45)        s
Receiving objects: 100% (193/193), 568.08 KiB | 205.00 KiB/s, done.
Resolving deltas: 100% (45/45), done.
Already on 'master'
Your branch is up to date with 'origin/master'.
[2/9] Performing update step for 'colorconsole-populate'
-- Fetching latest from the remote origin
[3/9] No patch step for 'colorconsole-populate'
[5/9] No configure step for 'colorconsole-populate'
[6/9] No build step for 'colorconsole-populate'
[7/9] No install step for 'colorconsole-populate'
[8/9] No test step for 'colorconsole-populate'
[9/9] Completed 'colorconsole-populate'
BUILD_SHARED_LIBS=ON
 === Library build set to SHARED
 === Settings setup complete
     Library will be build as SHARED
 === Building EXTERNAL docs
 === Doxygen config generated
 === Libconf settings complete
-- Found Doxygen: C:/msys64/mingw64/bin/doxygen.exe (found version "1.14.0") found components: doxygen dot
 === Documentation setup complete
 === Targets settings complete
 === Install settings complete
BUILD_SHARED_LIBS=ON
-- Configuring done (21.3s)
-- Generating done (0.2s)
-- Build files have been written to: C:/projects/colorconsole_libgit/build

Строки 

=== Library build set to SHARED

Указывают что наша библиотека собирается как разделяемая.

Запустим сборку:

cmake --build build
[build] [2/4  25% :: 6.378] Building CXX object CMakeFiles/colorconsoleapp.dir/main.cpp.obj
[build] [2/4  50% :: 6.527] Building CXX object _deps/colorconsole-build/CMakeFiles/colorconsole.dir/src/colorconsole.cpp.obj
[build] [3/4  75% :: 7.279] Linking CXX shared library _deps\colorconsole-build\libcolorconsole.dll
[build] [4/4 100% :: 7.786] Linking CXX executable colorconsoleapp.exe

Здесь мы видим, что CMake собрал и разделяемую версию библиотеки и саму программу.

Проверим что получилось:

ldd .\build\colorconsoleapp.exe
        ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x7ff81b290000)
        KERNEL32.DLL => /c/Windows/System32/KERNEL32.DLL (0x7ff81a0e0000)
        KERNELBASE.dll => /c/Windows/System32/KERNELBASE.dll (0x7ff818b50000)
        msvcrt.dll => /c/Windows/System32/msvcrt.dll (0x7ff819600000)
        libcolorconsole.dll => not found

Так как библиотека не установлена в папку Msys2, то и программа не запуститься, выйдя с сообщением об ошибке.

Нам нужно как то скопировать файл с разделяемой библиотекой libcolorconsole.dll в папку с исполняемым файлом.

Копируем файлы после окончания сборки с помощью CMake

В конец файла CMakeLists.txt добавим:

# Копируем разделяемую библиотеку из папки сборки библиотеки в папку сборки нашего проекта
add_custom_command(
        TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
               ${colorconsole_BINARY_DIR}/libcolorconsole.dll
               ${CMAKE_CURRENT_BINARY_DIR}/libcolorconsole.dll)

Мы добавили к текущему target команду, для копирования файла. Она будет выполнена только после успешной сборки программы.  На это указывает параметр:

POST_BUILD

Переменная:

${colorconsole_BINARY_DIR}

Создается автоматически и указывает на папку сборки для target colorconsole:

C:/projects/colorconsole_libgit/build/_deps/colorconsole-build

Переменная:

${CMAKE_CURRENT_BINARY_DIR}

Содержит путь к папке, в которой производится сборка нашего проекта и где будет создан исполняемый файл:

C:\projects\colorconsole_libgit\build

Запустим сборку:

cmake --build build

Будет автоматически запущено переконфигурирование проекта и его сборка.

Проверим:

ldd .\build\colorconsoleapp.exe
       ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x7ff81b290000)
       KERNEL32.DLL => /c/Windows/System32/KERNEL32.DLL (0x7ff81a0e0000)
       KERNELBASE.dll => /c/Windows/System32/KERNELBASE.dll (0x7ff818b50000)
       msvcrt.dll => /c/Windows/System32/msvcrt.dll (0x7ff819600000)
       libcolorconsole.dll => /c/projects/colorconsole_libgit/build/libcolorconsole.dll (0x7ff807ec0000)
       libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x7fffe9800000)
       libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x7ff806fb0000)
       libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x7ff806010000)

Запустим:

.\build\colorconsoleapp.exe

Программа отработала без ошибок.

Заключение

Сегодня мы рассмотрели использование git-репозитория для подключения библиотеки С++ к нашему проекту:

Создали новый проект CMake;

Добавили к нему исходный код и настройки для CMake;

Рассмотрели процесс конфигурирования и сборки статической версии библиотеки с нашим проектом;

Рассмотрели конфигурирование и сборку разделяемой (shared) версии библиотеки с нашим проектом;

Настроили автоматическое копирование разделяемой библиотеки .dll в папку с исполняемым файлом, после окончания сборки.

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

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

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

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