Кроссплатформенные C++ утилиты

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

В 2021ом году C++ по прежнему используется для написания неприхотливых к окружению утилит без лишних runtime-зависимостей. Между тем конкуренты, например, Rust предлагают не только безопасность, но и систему сборки c менеджером зависимостей по умолчанию. Для C++ де-факто тоже есть стандартная система сборкиCMake, но как подключать внешние библиотеки без боли? Вспомним, что для многих развитых технологий есть нечто вродеhttps://start.yourtechnology.io, создающих базовый стандартный проект, чтобы не тратить время на boilerplate конфигурацию. Под катом рассматривается именно такой шаблон который легко использовать для создания кроссплатформенных C++ проектов с менеджером зависимостей vcpkg

Почему vcpkg?

Во первых, из желания предельно упростить базовый проект и уменьшить количество файлов конфигурации в нем. Для C++ есть и другой развитый пакетный менджер Konan, но он требует добавления файла conanfile.txt, а vcpkg обходится одним стадартным CMakeLists.txt. Во вторых, vcpkg хорошо зарекомендовал себя и имеет стабильную поддержку в лице Microsoft.

1. Установка тулчейна для работы

Прежде всего нам понадобитсяCMake и сам менеджер зависимостей vcpkg, его можно установить через ваш любимый пакетный менеджер (например brew install vcpkg), или собрать вручную отсюда:
https://github.com/microsoft/vcpkg#getting-started

2. Установка зависимостей

Проверить есть ли нужная библиотека
vcpkg search yourdepname
Установить
vcpkg install yourdepname
Обратите внимание, что на машине осуществляющей сборку, библиотеке не кладутся в директории рядом с проектом, а устанавливаются в систему глобально, чтобы vcpkg мог их потом переиспользовать в других проектах. Например, для работы нашего шаблона требуется библиотека тестирования, парсер аргументов командой строки и форматированный вывод:
vcpkg install catch2
vcpkg install cli11
vcpkg install fmt
Приятным бонусом, после скачивания зависимости, vcpkg сам подскажет что дописать в CMakeLists.txt.

3. Сборка в один бинарник

Итак, у нас есть простой CMake проект использующий вышеуказанные вещи, как собрать один исполняемый файл?
(Если вы используете IDE, то весь третий шаг можно сократить просто установив для параметра CMake options результат выполнения командыvcpkg integrate install)

Cначала подготовим CMake в директории вашего проекта:
cmake `vcpkg integrate install | tail -1 | cut -d \"` -f2 -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" -B cmake-build-release
Если вы используете Windows, то вместо кода в `` ковычках, подставьте сюда вручную результат выполнения vcpkg integrate install

Затем, сборка будет осуществляться командой:
cmake --build cmake-build-release --target all

Итог

Как выглядит CMakeLists.txt после всех первичных манипуляций? Вовсе не страшно как можно было подумать, что на мой взгляд явно говорит в пользу vcpkg:

cmake_minimum_required(VERSION 3.17)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(proj)
file(GLOB proj_sources src/*.cpp)
add_executable(proj ${proj_sources})
find_package(fmt CONFIG REQUIRED)
target_link_libraries(proj PRIVATE fmt::fmt fmt::fmt-header-only)
find_package(CLI11 CONFIG REQUIRED)
target_link_libraries(proj PRIVATE CLI11::CLI11)

project(test)
#[[Changing the entry point for tests]]
list(FILTER proj_sources EXCLUDE REGEX ".*Main.cpp$")
file(GLOB test_sources test/*.cpp)
add_executable(test ${proj_sources} ${test_sources})
find_package(Catch2 CONFIG REQUIRED)
target_link_libraries(test PRIVATE Catch2::Catch2)
target_link_libraries(test PRIVATE CLI11::CLI11)
target_link_libraries(test PRIVATE fmt::fmt fmt::fmt-header-only)

Расширять такой проект по прежнему просто вызывая vcpkg install [...].
С++ в 21ом году совсем не страшный! Бонусом прилагаю GitHub шаблон где все это уже реализовано включая точку входа:
https://github.com/demidko/utility
Чтобы использовать шаблон для создания нового проекта, надо нажать кнопку `Use this template` вверху справа.

Интересно будет услышать критику подхода и альтернативные решения для кромплатформенных C++ проектов с зависимостями. Всем удачного дня!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Я использую в своих проектах

  • 0,0%vcpkg0
  • 0,0%konan0
  • 0,0%gradle0
  • 0,0%пишу на Go, зашел посмотреть как вы страдаете0
Источник: https://habr.com/ru/post/549788/


Интересные статьи

Интересные статьи

Используйте все возможности инструмента управления сетевыми подключениями NetworkManager в командной строке Linux c помощью утилиты nmcli. Утилита nmcli напрямую обращается к A...
Разбираемся, как использовать одну из самых мощных свободно распространяемых утилит для аудита Linux-систем. Вы когда-нибудь задумывались о том, насколько безопасна ваша Linux-си...
Те, кто собираются открывать интернет-магазин, предварительно начитавшись в интернете о важности уникального контента, о фильтрах, накладываемых поисковиками за копирование материалов с других ресурсо...
В интернет-магазинах, в том числе сделанных на готовых решениях 1C-Битрикс, часто неправильно реализован функционал быстрого заказа «Купить в 1 клик».
«Битрикс» — кошмар на костылях. Эта популярная характеристика системы среди разработчиков и продвиженцев ныне утратила свою актуальность.