Linux, С++, ThirdParty libs
Хорошо, просто вопрос. Я программирую на Visual С++ в Windows и для учебных целей изменился на Ubuntu и начал работать в Code:: Blocks, CodeLite и Eclipse. Я написал простую программу, используя SDL2
и GLEW
, чтобы создать простое приложение OpenGL на основе окна SDL2
. Я загрузил библиотеки с командами:
sudo apt-get install...
Мой главный вопрос: поскольку это приложение зависит от внешних библиотек (SDL2
, GLEW
, flu
, OIS
), оно не работает на других Linux-компьютерах. После установки всех этих библиотек с помощью команд терминала программа работает иначе, не будет выполнена. Мой вопрос в том, можно ли создать программу, которая не должна будет устанавливать эти библиотеки. Например, в Windows вы привязываете свою программу к SDL2.lib
и включаете SDL2.dll
в папку .exe
. Как я могу это сделать на linux. У меня очень мало опыта программирования linux и того, как работает материал, поэтому я надеюсь, что это просто основная проблема.:)
Ответы
Ответ 1
В Linux эквивалентны файлам dll
являются файлы .so
. Поэтому вам нужно доставить их вместе с вами.
Вы также можете связать статически с библиотеками. Это должно быть окончание .a
. С ними они напрямую скомпилируются в вашу программу, и вам не нужно их доставлять.
Более продвинутый (Linux-подобный) подход:
Что обычно делается в Linux (в качестве примера теперь Debian/Ubuntu) вы создаете пакет (в случае debian a .deb
-file - debian package). В этих пакетах вы можете добавить метаинформацию, например, о том, какие другие пакеты она зависит (эти пакеты можно установить с помощью apt-get).
Когда вы затем установите пакет вручную с помощью dpkg, он скажет вам, что зависимости отсутствуют, и вы можете исправить их с помощью apt-get -f install
. Вы также можете создать свой собственный apt-репозиторий, и он установит вашу программу с зависимостями только с помощью apt-get install ...
Другие дистрибутивы Linux имеют другие системы управления пакетами. Это как пример для debian/ubuntu.
Ответ 2
В связи с хорошим ответом от Hayt, я думаю, стоит упомянуть, что "классический" подход UNIX будет "компилироваться из коробки". Значение: вы фактически указываете "внешние" зависимости, которые необходимы вашей программе для компиляции; и вы в основном позволяете людям просто загружать некоторый исходный архив; и при извлечении... run
./configure
make
make install
или что-то подобное в их системе.
В этом случае инструмент "configure" проверяет все необходимые зависимости. См. здесь для дальнейшего чтения.
В настоящее время распространение пакетов DEB, RPM,... намного чаще; но есть определенная красота в том, что вы можете просто загрузить некоторые sources.tar.gz откуда-то; запускать эти три команды и иметь рабочую установку на основе локального компиляции в течение нескольких минут. Особенно, когда ваши пользователи могут захотеть сделать изменения исходным кодом. Но, конечно, это требует гораздо больше размышлений на вашем конце - поскольку вы хотите как можно больше ограничить свои "зависимости"; другими словами: вы хотите быть "стандартным", насколько это возможно.
Ответ 3
Одним из способов упрощения установки приложения является его упаковка (предполагается, что Ubuntu здесь). Предположим, вы создали свое приложение под названием foobar
. Создайте следующую структуру каталогов:
foobar_1.0/
|-- usr/local/bin
| `-- foobar
`-- DEBIAN/
`-- control
и поместите следующий текст в файл DEBIAN/control
:
Package: foobar
Version: 1.0
Section: games
Priority: optional
Architecture: i386
Depends: libsdl2, libglew1.10, anotherLibrary, yetAnotherOne
Maintainer: Your Name <[email protected]>
Description: A neat package which does foo and bar
Теперь вы можете создать свой пакет с помощью
dpkg-deb --build foobar_1.0
Затем ваши пользователи должны будут установить foobar
с помощью dpkg -i foobar_1.0.deb
, который установит foobar
в /usr/local/bin
. Этот каталог предназначен для программного обеспечения, которое вы создаете из источников или устанавливаете из неофициальных пакетов, избегая возможных конфликтов имен в /usr/bin
(где исполняются бинарные файлы из официальных пакетов).
Если вашим пользователям не хватает каких-либо зависимостей, перечисленных в DEBIAN/control
, они будут рассказаны об этом во время установки. Простое выполнение apt-get -f install
установит их. Удаление foobar
также помечает эти зависимости как неиспользуемые, поэтому пользователям будет предложено удалить их, когда они удаляют ваш пакет.