Здравствуйте!
Готовлю сейчас релиз своего 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. С обычного файла, например так:
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);
Ни та ни другая иконка не показывается, так что есть подозрение, что проблемма где-то в отрисовке, но никак не в загрузке.