LINUX.ORG.RU

Переносимое приложение на Qt. Запускается, но не подгружает иконки.


0

1

Здравствуйте!


Готовлю сейчас релиз своего Qt-приложения. Хочу облегчить жизнь пользователям, чтобы они могли запустить программу на любом дистрибутиве, просто распаковав каталог. Поэтому делаю релиз в виде переносимого приложения.

Система, на которой я пишу программу - Debian Stable.
Система, на которой пытаюсь запустить программу - Ubuntu 10.10.

Я создал подкаталог ./lib относительно бинарника, куда должны копироваться библиотеки, и написал скрипт запуска mytetra.run:

#!/bin/sh

LD_LIBRARY_PATH=./lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH

./mytetra

Затем начал экспериментировать с библиотеками.

У меня установлена самосборная Qt 4.5, под которой и скомпилена программа. Вначале я решил не добавлять свои самосборные библиотеки из /usr/lib, а воспользоваться теми, которые идут в комплекте cо всякими QtCreator сборки компании Nokia, ведь эти программы запускаются на всех дистрибутивах.

Мне нужны вот такие библиотеки:

lrwxrwxrwx 1 xi xi       18 Окт 30 00:57 libQtCore.so -> libQtCore.so.4.5.3
lrwxrwxrwx 1 xi xi       18 Окт 30 00:57 libQtCore.so.4 -> libQtCore.so.4.5.3
lrwxrwxrwx 1 xi xi       18 Окт 30 00:57 libQtCore.so.4.5 -> libQtCore.so.4.5.3
-rw-r--r-- 1 xi xi  2336164 Окт 16  2009 libQtCore.so.4.5.3
lrwxrwxrwx 1 xi xi       17 Окт 30 00:57 libQtGui.so -> libQtGui.so.4.5.3
lrwxrwxrwx 1 xi xi       17 Окт 30 00:57 libQtGui.so.4 -> libQtGui.so.4.5.3
lrwxrwxrwx 1 xi xi       17 Окт 30 00:57 libQtGui.so.4.5 -> libQtGui.so.4.5.3
-rw-r--r-- 1 xi xi 10193176 Окт 16  2009 libQtGui.so.4.5.3
lrwxrwxrwx 1 xi xi       21 Окт 30 00:57 libQtNetwork.so -> libQtNetwork.so.4.5.3
lrwxrwxrwx 1 xi xi       21 Окт 30 00:57 libQtNetwork.so.4 -> libQtNetwork.so.4.5.3
lrwxrwxrwx 1 xi xi       21 Окт 30 00:57 libQtNetwork.so.4.5 -> libQtNetwork.so.4.5.3
-rw-r--r-- 1 xi xi  1144920 Окт 16  2009 libQtNetwork.so.4.5.3
lrwxrwxrwx 1 xi xi       17 Окт 30 00:57 libQtSvg.so -> libQtSvg.so.4.5.3
lrwxrwxrwx 1 xi xi       17 Окт 30 00:57 libQtSvg.so.4 -> libQtSvg.so.4.5.3
lrwxrwxrwx 1 xi xi       17 Окт 30 00:57 libQtSvg.so.4.5 -> libQtSvg.so.4.5.3
-rw-r--r-- 1 xi xi   336376 Окт 16  2009 libQtSvg.so.4.5.3
lrwxrwxrwx 1 xi xi       17 Окт 30 00:57 libQtXml.so -> libQtXml.so.4.5.3
lrwxrwxrwx 1 xi xi       17 Окт 30 00:57 libQtXml.so.4 -> libQtXml.so.4.5.3
lrwxrwxrwx 1 xi xi       17 Окт 30 00:57 libQtXml.so.4.5 -> libQtXml.so.4.5.3
-rw-r--r-- 1 xi xi   274084 Окт 16  2009 libQtXml.so.4.5.3

Вначале решил проверять, как будет запускаться программа через mytetra.run на исходной системе, в которой я и провожу разработку. Для этого я начал наполнять каталог ./lib библиотеками.

1. Вначале попробовал взять библиотеки Qt 4.5 от QtCreator-0.9.1. Программа стала запускаться из скрипта mytetra.run. Однако, ни одна SVG-иконка на кнопках не показывается. Выглядит это дело так: http://rghost.ru/3088503/image.png.

2. Тогда попробовал взять библиотеки Qt 4.7 от QtCreator-2.0.1. Программа запускается из скрипта mytetra.run. Однако, ни одна SVG-иконка на кнопках не показывается, плюс почему-то используется другой шрифт. Выглядит это дело так: http://rghost.ru/3088525/image.png.

3. Мне ничего не оставалось, как скопировать свои самосборные библиотеки. С ними программа, как и ожидалось, запускается нормально, SVG-иконки на кнопках стали видны. Выглядит так: http://rghost.ru/3088509/image.png.


Затем я скопировал каталог с этим дистрибутивом программы (с самосборными библиотеками) на Ubuntu, попытался запустить через mytetra.run. Вначале программа ругнулась на отсутсвия libasound.so.2. Ну чтож, скопировал из Debian в каталог ./lib и её. После этого программа запустилась. Но SVG-иконки почему-то невидны! Вот так: http://rghost.ru/3088495/image.png.

То есть, в Debian иконки видны, а в Ubuntu - невидны, с одними и теми же Qt библиотеками.


И вот я незнаю, что еще нужно сделать, чтоб в Ubuntu стали нормально отображаться SVG-иконки.


...Блин, лор не позволяет длинные сообщения, в комментариях продолжение...

Самое интересное, что ldd на исполняемом файле в Debian выдает такой список:

        linux-gate.so.1 =>  (0xb7f81000)
        libQtSvg.so.4 => /usr/lib/libQtSvg.so.4 (0xb7f12000)
        libQtXml.so.4 => /usr/lib/libQtXml.so.4 (0xb7ece000)
        libQtGui.so.4 => /usr/lib/libQtGui.so.4 (0xb7511000)
        libQtNetwork.so.4 => /usr/lib/libQtNetwork.so.4 (0xb73f9000)
        libQtCore.so.4 => /usr/lib/libQtCore.so.4 (0xb71bd000)
        libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb71a4000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb70b6000)
        libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7090000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7083000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb6f27000)
        libz.so.1 => /usr/lib/libz.so.1 (0xb6f12000)
        libaudio.so.2 => /usr/lib/libaudio.so.2 (0xb6efc000)
        libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb6ed8000)
        libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb6e63000)
        libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb6e26000)
        libSM.so.6 => /usr/lib/libSM.so.6 (0xb6e1e000)
        libICE.so.6 => /usr/lib/libICE.so.6 (0xb6e07000)
        libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb6d52000)
        libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb6d49000)
        libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb6d1e000)
        libXext.so.6 => /usr/lib/libXext.so.6 (0xb6d0f000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0xb6c20000)
        libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb6c1b000)
        librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb6c12000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb6c0e000)
        /lib/ld-linux.so.2 (0xb7f82000)
        libXt.so.6 => /usr/lib/libXt.so.6 (0xb6bbd000)
        libpcre.so.3 => /usr/lib/libpcre.so.3 (0xb6b94000)
        libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb6b6e000)
        libXau.so.6 => /usr/lib/libXau.so.6 (0xb6b6b000)
        libxcb-xlib.so.0 => /usr/lib/libxcb-xlib.so.0 (0xb6b69000)
        libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb6b50000)
        libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb6b4b000)

Та же команда на том же бинарнике в Ubuntu (с установленной переменной LD_LIBRARY_PATH) выдает такой список:

	linux-gate.so.1 =>  (0x00345000)
	libQtSvg.so.4 => ./lib/libQtSvg.so.4 (0x00b2e000)
	libQtXml.so.4 => ./lib/libQtXml.so.4 (0x003a9000)
	libQtGui.so.4 => ./lib/libQtGui.so.4 (0x00b81000)
	libQtNetwork.so.4 => ./lib/libQtNetwork.so.4 (0x00110000)
	libQtCore.so.4 => ./lib/libQtCore.so.4 (0x003ed000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x00228000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00242000)
	libm.so.6 => /lib/libm.so.6 (0x00b02000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00346000)
	libc.so.6 => /lib/libc.so.6 (0x00629000)
	libz.so.1 => /lib/libz.so.1 (0x0032d000)
	libaudio.so.2 => ./lib/libaudio.so.2 (0x00362000)
	libpng12.so.0 => /lib/libpng12.so.0 (0x00378000)
	libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00787000)
	libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x007fe000)
	libSM.so.6 => /usr/lib/libSM.so.6 (0x0039d000)
	libICE.so.6 => /usr/lib/libICE.so.6 (0x00925000)
	libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0x0093e000)
	libXrender.so.1 => /usr/lib/libXrender.so.1 (0x00840000)
	libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00abb000)
	libXext.so.6 => /usr/lib/libXext.so.6 (0x0084a000)
	libX11.so.6 => /usr/lib/libX11.so.6 (0x08e60000)
	libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x0085a000)
	librt.so.1 => /lib/librt.so.1 (0x0085f000)
	libdl.so.2 => /lib/libdl.so.2 (0x00868000)
	/lib/ld-linux.so.2 (0x00901000)
	libXt.so.6 => /usr/lib/libXt.so.6 (0x0086c000)
	libpcre.so.3 => /lib/libpcre.so.3 (0x008bf000)
	libuuid.so.1 => /lib/libuuid.so.1 (0x008f4000)
	libexpat.so.1 => /lib/libexpat.so.1 (0x00a0d000)
	libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00a34000)
	libXau.so.6 => /usr/lib/libXau.so.6 (0x008f9000)
	libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x0091f000)

Отличия можно посмотреть на этой картинке: http://rghost.ru/3088444/image.png. Сверху идут только Qt-библиотеки, они, естественно, отличаются путем. Далее идут системные библиотеки. Где-то пути различны, где-то совпадают, неважно. Под конец одной библиотеки нет в Ubuntu, зато есть другая. Вот и всё различие.

Я думал, что может в Ubuntu нет какой-то библиотеки типа libsvg, но она и не используется, так что на нее нечего грешить.

Вопросы:

1. Чего не хватает в фирменных либах Qt 4.5 и Qt.4.7 от разных QtCreator, что не показываются SVG иконки?

2. Чего не хватает в Ubuntu, что с либой, с которой в Debian иконки есть, с той же либой в Ubuntu SVG-иконок нет?

ЗЫЖ

Иконки у меня в программе подгружаются двумя способами.

1. С обычного файла, например так:

bold = new QToolButton(this);
bold->setIcon(QIcon("./resource/pic/edit_bold.svg"));

2. Из файла ресурсов:

QIcon icon = QIcon(":/resource/pic/logo.svg");
tray_icon->setIcon(icon);
setWindowIcon(icon);

Ни та ни другая иконка не показывается, так что есть подозрение, что проблемма где-то в отрисовке, но никак не в загрузке.

xintrea ()

IMHO у тебя может не хватать imageformat для svg, эти плагины подцепляются динамически и не попадают в ldd. Попробуй создать рядом с исполняемым файлом то ли катало imageformats, то ли plugins/imageformats и помести в него libqsvg.so, который можно добыть из того-же криэйтора или просто Qt. Еще есть какой-то plugins/iconengines/libqsvgicon.so, может тут скорее он нужен.

YesSSS ★★★ ()

LD_LIBRARY_PATH=./lib:${LD_LIBRARY_PATH}

Don't do that!!!

Вы добавляете пустую запись в LD_LIBRARY_PATH, что эквивалентно текущему каталогу. Ваша программа будет грузить стандартные библиотеки из текущего каталога как это было недавно в Windows, и это является серьёзной уязвимостью.

bvvv ()
Ответ на: комментарий от bvvv

Да, забыл сказать как правильно. Вот так:

LD_LIBRARY_PATH=lib:${LD_LIBRARY_PATH:+":$LD_LIBRARY_PATH"}

bvvv ()
Ответ на: комментарий от YesSSS

Как уже сказал YesSSS - дело в плагине. Система плагинов Qt дополнительно проверяет загружаемую библиотеку на совместимость с версией Qt и параметрами сборки.

During development, the directory for plugins is QTDIR/plugins (where QTDIR is the directory where Qt is installed)

Очень похоже, что другие библиотеки Qt просто не нашли плагины из этой директории. В то время как вашей самосборной захардкоден путь к ней. В любом случае, как опять таки сказал YesSSS, проблема должна решаться созданием директории imageformat, в которой должен лежать libqsvg.so от той же библиотеки Qt.

Dendy ★★★★★ ()
Ответ на: комментарий от Dendy

Всем спасибо, получилось запустить.

Нужно было добавить две директории - iconengines и imageformats, в которых находятся нужные библиотеки, и положить их рядом с бинарником, вот так:

drwxr-xr-x 2 xi xi     4096 Окт 30 19:32 iconengines
drwxr-xr-x 2 xi xi     4096 Окт 30 19:32 imageformats
drwxr-xr-x 2 xi xi     4096 Окт 30 19:32 lib
-rwxr-xr-x 1 xi xi 10240010 Окт 30 01:24 mytetra
-rwxr-xr-x 1 xi xi      149 Окт 30 19:26 mytetra.run
xintrea ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.