Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Октябрь 30, 2010, 01:50



Название: Переносимое приложение на Qt. Запускается, но не подгружает иконки.
Отправлено: xintrea от Октябрь 30, 2010, 01:50
Здравствуйте!


Готовлю сейчас релиз своего 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 (http://rghost.ru/3088503/image.png).

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

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


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

Код
C++ (Qt)
bold = new QToolButton(this);
bold->setIcon(QIcon("./resource/pic/edit_bold.svg"));


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

Код
C++ (Qt)
QIcon icon = QIcon(":/resource/pic/logo.svg");
tray_icon->setIcon(icon);
setWindowIcon(icon);

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


Название: Re: Переносимое приложение на Qt. Запускается, но не подгружает иконки.
Отправлено: Rcus от Октябрь 30, 2010, 07:55
Даже странно, вроде для загрузки svg в QIcon требовался plugins/iconengines/libqsvgicon.so, но его почему-то не видно...
Блин это ж ldd...

правильная команда для просмотра загружаемых библиотек это cat /proc/`pidof $APPNAME`/maps (| grep 'r-xp' по желанию)


Название: Re: Переносимое приложение на Qt. Запускается, но не подгружает иконки.
Отправлено: GreatSnake от Октябрь 30, 2010, 11:35
Цитировать
Хочу облегчить жизнь пользователям
Такими скриптами и загрузкой файлов "./*" вы им только усложните жизнь.
Получается, что ваша программа должна запускаться только из каталога куда её установят.
Так делать нельзя. Нужно сделать install скрипт, который будет создавать скрипт запуска вашей программы, в котором будет выставляться переменная среды типа YOUR_PROGRAMM_INSTALL_DIR.
Уже в приложении получать значение этой переменной и по этому значению формировать путь к вашим файлам. И этот скрипт запуска выложить куда-нибудь в /usr/local/bin или в /opt/bin в зависимости от дистрибутива.


Название: Re: Переносимое приложение на Qt. Запускается, но не подгружает иконки.
Отправлено: andrew.k от Ноябрь 03, 2010, 14:15
Ни та ни другая иконка не показывается, так что есть подозрение, что проблемма где-то в отрисовке, но никак не в загрузке.
нужно рядом с программой положить деректорию imageformats и в нее положить соответствующие библиотеки из QTDIR/plugins/imageformats
Например, libqjpeg.so.
У меня заработало только в таком виде.
если класть библиотеки рядом с программой - не работает. Строго так.
Это естественно касательно случая, когда нужно запустить программу на компе, на котором отсутствует кути.
Если на компе будет прописана правильно QTDIR и кути будет подходящей версии, то плагины подгрузятся оттуда.