@Kotis

Как написать правильно приложение на с++?

есть мой код, есть библиотека. Две эти сущности я пытаюсь собрать с помощью CMake, но есть пара но.
но_1) Подключение самой библиотеки оказалось уже геморройным, но немного углубившись в гайды, я "закрыл" для себя этот вопрос, найдя в гайдовых make-листах строки начинающиеся на "find_package".
но_2) Я так понял, эти строки растут от пакетных менеджеров, но немного изучив их работу, мне показалось, что они сначала собирают библиотеку под конкретную платформу и только потом дают ей пользоваться, что вернуло меня к первому но.

Так вот, у меня два вопроса:
Если:
1) Правда ли, что именно такая механика у пакетных менеджеров?
То:
2) Как тогда правильно собирать код CMake'ом?

Но если ответ на первый вопрос нет, то у меня ещё больше вопросов:
1) Нужен ли пакетный менеджер на машине, к примеру, моего друга, которому я кину прогу или он может воспользоваться просто CMake'ом
2) Если к примеру пакетный менеджер это vcpkg, то нужно ли мне его размещать в самом проекте (насколько я понял, если использовать vcpkg install *lib_name*, то он установит либу в папку vcpkg)
3) Не вопрос, скорее просьба посоветовать, каким PM лучше пользоваться?
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ответы на вопрос 3
@calculator212
1) Cmake - это система сборки, по сути просто генерится makefile и вы потом компилируете программу, поэтому если вы скомпилировали программу, то cmake не нужен. Но программа может на другом пк не запуститься из-за отсутствия на нём необходимых библиотек для работы программы.
2) В целом какой пакетный менеджер - это не сильно важно, но если есть возможность то лучше выбрать что-то популярное. Что действительно важно - это сделать readme с нормальным описанием того, как установить все зависимости.
3) Под linux я чаще всего видел Cmake и еще иногда используют conan и bazel, под винду и мак хз.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Что бы при переносе вашей программы на другой комп не терялись зависимости (библиотеки), нужно эти зависимости передавать вместе с программой явно - передавать необходимые dll файлы. Обычно для этого делают установочный пакет, куда входит все необходимое плюс скрипт установки, если требуются какие-то дополнительные действия, кроме копирования файлов.
Другой вариант - использовать статическую компиляцию с библиотеками, тогда библиотека будет входить в состав вашего исполняемого файла. Размер исполняемого файла при этом будет заметно больше.

В линуксе для динамических библиотек используется каталог (/lib; /usr/lib) отличный от каталога с исполняемыми файлами (/bin, /usr/bin), поэтому появляется возможность устанавливать библиотеки через пакеты пакетного менеджера универсально для всех программ, использующих данную библиотеку. В пакете программы просто указывается зависимости от пакетов используемых библиотек.
В винде принято все зависимости программы устанавливать в каталог с исполняемым файлом программы. И тут нет какого-то общепринятого механизма делать как линуксе. Хотя никто не запрещает вам делать свой собственный софт с подобным механизмом, но сам механизм вы должны придумать и поддерживать самостоятельно в своем софте и кроме ваших программ никто больше использовать этот механизм не будет.

В cmake есть еще вариант поиска пакетов с помощью pkg-config: https://cmake.org/cmake/help/latest/module/FindPkg...
Ответ написан
Комментировать
@sergiodev
1. Пакетные менеджеры тут ни при чём. В CMake называются "пакетами" сторонние сущности, находимые при конфигурировании проекта. Это могут быть библиотеки, программы и т.п. В общем, к понятию пакета в каком-то дистрибутиве Linux или vcpkg оно не привязано.

1) Пакетный менеджером пользоваться необязательно - достаточно установить бинарники библиотеки в одну из директорий, где CMake их сможет найти. Подробнее об этом написано в доках к find_package(). Один из таких путей указывается через CMAKE_PREFIX_PATH, например.

2) Нет, vcpkg обычно не нужно добавлять в проект, он должен быть предустановлен на машине разработчика. Включать целиком vcpkg в репозиторий нет смысла, т.к. каждый разработчик может ставить библиотеки в различных конфигурациях под разные платформы на своё усмотрение (debug, release, windows, windows-static, x64, x86 и т.п.).

3) Зависит от ОС. Под Windows vcpkg - лучший вариант по-моему. Под Linux и macOS есть apt (или его аналог) и homebrew, где уже есть большинство библиотек - там vcpkg не так актуален. Если не хочется париться с установкой зависимостей на каждом компьютере или нужна какая-то конкретная версия библиотеки, отсутствующая в репозитории пакетов, то можно её код просто включить в проект и скомпилировать её с тем же CMake-ом - либо как подпроект (subdirectory), либо как external project.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы