Где установить файлы для Qt-приложения в Ubuntu / Debian

Я ищу советы о том, как упаковать мое приложение на основе Qt для дистрибутивов Ubuntu / Debian. Скажем, приложение (исполняемый файл) myapp. Запустив objdump -p myapp | grep NEEDED, я вижу, что у него следующие зависимости:

libicuuc.so.44
libicui18n.so.44
libicudata.so.44
libQtGui.so.4
libQtCore.so.4
libpthread.so.0
libstdc++.so.6
libm.so.6
libgcc_s.so.1
libc.so.6

Я просмотрел несколько онлайн-документов (перечисленных в конце этого вопроса), но мне все еще неясно, где установить фактические файлы.

Стандарт иерархии файловой системы Debian предлагает (я думаю) установить myapp в /usr/local/bin, но я не уверен насчет библиотек ICU и Qt. Важно, чтобы использовалась точная версия некоторых из этих библиотек. (У них есть черновики API, которые используются, которые могут выйти из строя в будущих версиях.)

  • Я хочу избежать «ада совместно используемых библиотек», так что я склонен помещать их в каталог приложения (/usr/local/bin), но стандарт иерархии файловой системы Debian, похоже, не одобряет этого.
  • Я мог бы поместить их в /usr/local/lib/myapp, но тогда как я могу гарантировать, что правильная версия связана динамически? И если я это сделаю, что мне нужно сделать, чтобы добавить этот каталог в LD_LIBRARY_PATH целевой системы?

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

Вот некоторые из документов, которые я изучил до сих пор:


person Dave Mateer    schedule 22.06.2010    source источник


Ответы (2)


Вам необходимо просмотреть раздел control. Вам не следует распространять эти разделяемые библиотеки, если вы не собираете их из исходного кода в своем коде. Эти библиотеки принадлежат другим пакетам, которые вам нужно указать как Depends или Build-Depends для вашего пакета.

Вы говорите, что плохо знакомы с упаковкой в ​​системах Ubuntu, для каких платформ вы упаковали? Если бы это была только винда, вы привыкли к аду dll. В Linux этого намного проще избежать, поскольку вы можете сказать, что для этого требуются определенные библиотеки, а установщик пакета знает, как найти эти библиотеки.

person Adam W    schedule 22.06.2010
comment
Я собираю по крайней мере одну из библиотек из исходников, возможно, с некоторыми изменениями. (Я добавлю суффикс к библиотеке, если это так.) Что мне тогда делать? Кроме того, могу ли я сказать системе, чтобы она НЕ позволяла использовать будущую версию, т.е. где so.44 становится символической ссылкой на so.50? Мои пользователи будут устанавливать в основном офлайн. Как сообщить диспетчеру пакетов, что нужно искать зависимости из автономного источника? Спасибо за помощь! - person Dave Mateer; 22.06.2010
comment
И да, мой опыт до этого момента - Windows. Кажется, решение здесь состоит в том, чтобы просто отбросить нужные библиотеки в папку приложения, и все в порядке. Библиотеки ICU рекомендовали эту процедуру для всех платформ (если я не читаю документ неправильно) ... отсюда и мое замешательство. - person Dave Mateer; 22.06.2010
comment
@Dave: Взгляните сюда: linuxfordevices.com/c/a/Linux-For-Devices-Articles/ В разделе Depend вы указываете: qt (= 4.6.3) или что-то подобное для каждой библиотеки и версии, которая вам нужна. Просто проверьте версии используемых вами библиотек и установите соответствующие условия. - person Adam W; 22.06.2010
comment
@Dave: Debian уже имеет пакет icu: packages.debian.org/, и похоже, что они названы в зависимости от версии, что немного упрощает ваш список зависимостей. - person Adam W; 22.06.2010
comment
Перетащите библиотеки в папку приложения, в основном предназначенную для Win32. Вам нужно изменить библиотеки ICU? Так проще, если в этом нет необходимости. - person Steven R. Loomis; 22.06.2010
comment
@Steven: Единственные изменения, которые я делаю на данный момент, - это использование редактирования define U_USING_ICU_NAMESPACE 0 и определение U_CHARSET_IS_UTF8=1. Но я также использую C ++ и черновик API, и README заставляет меня думать, что они недоступны (или могут быть хрупкими), если ICU установлен как системная библиотека. Я правильно понимаю? Кроме того, libicu44 приводит к тому, что зависимость не может быть устранена при чистой установке Ubuntu 10.04. :( - person Dave Mateer; 22.06.2010
comment
@Dave: Похоже, в Ubuntu есть только libicu42 packages.ubuntu.com/ В идеале вы должны упаковать libicu44 отдельно от своего приложения, если вам действительно нужна эта версия. - person Adam W; 22.06.2010
comment
@ Адам: Спасибо; Я действительно ценю всю помощь - извините, я такой новичок во всем этом! Как именно это упаковать отдельно? Вы имеете в виду включить libicu44 в раздел Depends:, а затем есть какая-то другая команда, которая говорит: Кстати, вот где вы можете получить эту зависимость, которая указывает на ... что? В конце концов, я ищу установку с компакт-диска одним щелчком мыши для пользователей, которые в основном отключены от Интернета. Любые возможные зависимости должны быть разрешены локально. - person Dave Mateer; 22.06.2010
comment
@Dave: Что ж, теперь вы выходите за рамки моего опыта, но вам, возможно, придется настроить компакт-диск в качестве репозитория (например, PPA, если вы когда-либо его использовали). Взгляните здесь: isotton.com/software/debian / docs / repository-howto /, затем просто создайте пакет для libicu44 и один для вашего приложения, которые оба находятся в репозитории. Затем вам нужно добавить этот репозиторий в качестве источника для apt (если я правильно помню, давно не использовал Ubuntu). - person Adam W; 22.06.2010
comment
Спасибо, Адам. Я очень ценю вашу помощь! - person Dave Mateer; 23.06.2010

Если вы действительно хотите убедиться, что ваше приложение использует библиотеки, с которыми вы его поставляете, вероятно, имеет смысл просто сделать статическое связывание лицензии, позволяющей это. Поскольку вы используете специальную, конкретную версию библиотек, вы действительно не хотите, чтобы какие-либо другие приложения использовали ваши библиотеки вместо системных библиотек, предоставляемых системой управления пакетами. Раньше я создавал статическую версию Qt, и это несколько неудобно, но не намного больше, чем создание обычной динамически связанной версии Qt. Я не работал в отделении интенсивной терапии, но, думаю, не хуже.

В противном случае ... Да, поместите все это в каталог приложения, аккуратно подальше от остальной системы. По моему опыту, большинство приложений, которые делают подобные вещи, не следуют каким-либо официальным стандартам распространения для этого, поэтому у пользователей нет особых ожиданий в этом отношении.

person wrosecrans    schedule 25.09.2010