Зависимости от внешних библиотек в проекте c++

В настоящее время я пытаюсь настроить проект на C++, b который использует библиотеку luabind. К сожалению, в моем дистрибутиве, а именно в Arch, этой библиотеки нет в официальных репозиториях, а та, что в AUR, устарела и не компилируется.

Учитывая, что мне нужна библиотека только для этого проекта, я подумал, что могу создать изолированную среду, похожую на виртуальную среду Python, создав библиотеку, затем установив (скопировав) включаемые файлы и получившиеся двоичные файлы в 2 подкаталогах моего проекта с именами include и lib , соответственно которые я добавлю в компоновку и включу пути при сборке. Я понимаю, почему распространять библиотеки с вашим проектом плохо: например, безопасность и исправления ошибок. Однако распространение DLL почти повсеместно выполняется в Windows (что я мог бы сделать, если бы выполнял кросс-компиляцию), и многие проекты, такие как игры для Linux, имеют тенденцию упаковывать свои библиотеки, чтобы избежать несоответствий между дистрибутивами. Более того, если мне когда-нибудь понадобится исправленная или разветвленная версия библиотеки, я сомневаюсь, что когда-нибудь найду ее в каком-либо официальном репо.

Итак, мой вопрос:

  • Является ли то, что я описал выше, обычной практикой? Должен ли я сделать это так?
  • Если нет, то какое наиболее часто встречающееся решение этой проблемы?

ПРИМЕЧАНИЕ. Я использую Cmake для автоматизации сборки, если это имеет значение.

EDIT: Этот вопрос немного совпадает с моим.


person nikitautiu    schedule 04.11.2013    source источник


Ответы (1)


Ваш подход интересен, но вам не нужно разрабатывать работающую систему, потому что это уже сделано, и, к счастью, вы всего в одном шаге от решения!

С помощью CMake легко автоматизировать сборку и связывание внешнего исходного кода с помощью ExternalProject.

См. http://www.kitware.com/media/html/BuildingExternalProjectsWithCMake2.8.html для получения полезной информации.

Этот подход имеет несколько преимуществ:

  • вам не нужно включать исходный код библиотеки в свой репозиторий
  • вы можете указать конкретную версию/тег git библиотеки, которая, как вы знаете, работает с вашим программным обеспечением ИЛИ последнюю версию, если вы уверены, что это не нарушит совместимость
  • вам не нужно писать полный файл CMakeLists.txt для создания возможно сложной базы кода
  • в конечном итоге вы можете настроить внешний проект для сборки в виде статической библиотеки, поэтому вам не придется распространять общие библиотеки.
  • вы даже можете полностью обойти это, если в этом нет необходимости, попытавшись обнаружить работающую версию библиотеки в вашей системе с помощью обычного вызова find_package и вернуться к ее сборке как внешний проект, только если она не найдена.
person SirDarius    schedule 04.11.2013
comment
+1 cmake никогда не перестанет быть удобным. Однако даже с модулем ExternalProject мне все еще кажется, что я загрязняю свою систему всеми установками библиотек. Это нормально, если я установлю путь установки (библиотеки и заголовки) внутри рабочего каталога проекта? (по крайней мере, для отладочной сборки выпуск можно связать с системными библиотеками, если они доступны, или включить их) - person nikitautiu; 04.11.2013
comment
Да, так оно и должно работать. Каталог установки должен находиться в папке CMAKE_BINARY_DIR. Весь процесс не предполагает изменений в масштабах всей системы. - person SirDarius; 05.11.2013