Используем в проекте библиотеку С++ из 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 в папку с исполняемым файлом, после окончания сборки.
Добавить комментарий