Russian Qt Forum
Ноябрь 02, 2024, 13:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Запуск приложения в любом дистрибутиве Linux.  (Прочитано 21161 раз)
NicK
Гость
« : Май 30, 2010, 00:42 »

Имеется приложение, которое необходимо запускать в любом дистрибутиве Linux, не зависимо от наличия/версии Qt в системе. В виндах все понятно: там все решается тупым копированием нужных dll'ок в директорию с программой.

Вопрос в том как это сделать в Linux.
Пробовал сделать по принципу, как в винде: запустил ldd. посмотрел, что программа требует для запуска.
Создал директорию lib и скопировал туда нужные файлы:
libQtCore.so.4 
libQtGui.so.4 
libQtNetwork.so.4 
libQtSql.so.4

а для запуска приложения использую LD_LIBRARY_PATH.
Т.е. запускаю программу, использую*.sh файл, где указываю что-то типа этого:
Код
Bash
bindir=`dirname "$me"`
libdir=`cd "${bindir}/lib" ; pwd`
LD_LIBRARY_PATH="${libdir}:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
#exec "${bindir}" ${1+"$@"}
 
prog2run=`"${bindir}/my_application"`
exec $prog2run

Проблема в том, что, помимо Qt-шных библиотек, для запуска приложения необходимы всякие libglib-2.0.so.0, libc.so.6, libgcc_s.so.1 и т.п. И, даже скопировав их в ту же директорию, объявленную в  LD_LIBRARY_PATH, в дистрибутивах с более старой версией библиотек, программа не запускается, ругаясь таким образом:

relocation error: /home/nick/my_application/lib/libglib-2.0.so.0: symbol strncmp, version GLIBC_2.0 not defined in file libc.so.6 with link time reference.

Подскажите, пожалуйста, как решить эту проблему?
Записан
michael1960
Гость
« Ответ #1 : Май 30, 2010, 01:13 »

Вам по моему, надо скомпилировать Qt, со статическими библиотеками, когда компилитуете Qt, чтоб она была независима от системных библиотек, надо указать следующие ключи:

-release -static -qt-zlib -qt-gif -qt-libmng -qt-libpng -qt-libtiff -qt-libjpeg ...

эти обязательны для получения статической сборки Qt. Я это пробывал и программа пошла на почти всех дистрибутивах, даю вам линк к программе, чтоб вы сами убедились в этом, Только извините, но интерфейс пока только болгарский, но запускается почти на всех дистрибутивах, которые 32 битовые.

http://www.fileden.com/files/2009/12/4/2675571/linux32/Balans32.tar.bz2

Так, между прочим, я компилировал и для Windows, и программа работает без всяких DLL, так что потребителэ, не обязательно иметь у себя в системме Qt

Записан
garryHotDog
Гость
« Ответ #2 : Май 30, 2010, 10:12 »

компилировал как static в Ubuntu, но в Redhat ругалась на другую версию Glib!?....пришлось собирать в RedHat!
Записан
michael1960
Гость
« Ответ #3 : Май 30, 2010, 10:29 »

компилировал как static в Ubuntu, но в Redhat ругалась на другую версию Glib!?....пришлось собирать в RedHat!

В том то и весь проблем, с Qt, так сказать всё нормально, и как показали проведёные тесты в Болгарии, на большинстве дистрибутивов запускается без проблем. Но например на Debian sid, при неизвестно каких условий на Ubuntu 10.4, RedHat, ... не запускается, а собрать glibc, как статическую, у меня почему то не получается. У меня дистрибутив Slackware 13.0, и программа скомпилирована на этой дистрибуции.  Грустный
Записан
garryHotDog
Гость
« Ответ #4 : Май 30, 2010, 10:36 »

для себя - проблему запуска на различных дистрибутивах решил - сборкой проекта в родной среде!!! другого, более оптимального способа, не нашел!!!!
Записан
michael1960
Гость
« Ответ #5 : Май 30, 2010, 10:59 »

компилировал как static в Ubuntu, но в Redhat ругалась на другую версию Glib!?....пришлось собирать в RedHat!

Извините но я забыл, вот проблему с Glib, я решил исключая её, это делается с ключом -no-gtkstyle, при компиляции Qt. Я не знаю вам это решение подойдёт или нет, но так в Qt, остаётся только то что зависит от Qt.
Записан
AleUri
Гость
« Ответ #6 : Май 30, 2010, 12:05 »

а есть ли у кого опыт использования Statifier - http://statifier.sourceforge.net/ ?
Записан
garryHotDog
Гость
« Ответ #7 : Май 30, 2010, 13:16 »

Цитировать
я решил исключая её, это делается с ключом -no-gtkstyle

спасибо, попробую!
Записан
valery
Гость
« Ответ #8 : Май 30, 2010, 15:24 »

а есть ли у кого опыт использования Statifier - http://statifier.sourceforge.net/ ?
У statifier'a  две основные проблемы:
1. Memory randomization. -  На системах где все адреса меняются от одного запуска программы к другому программа,
созданная с помощью statifier, обычно выводит только одно сообщение: Segmentation fault.

2. Statifier пакует только библиотеки. Но qt-программы кроме библиотек используют еще и файлы конфигурации,
которые говорят откуда и какие библиотеки загружать.

Ermine (http://magicErmine.com) не имеет этих ограничений, но имеет другое - эта программа коммерческая.
Записан
garryHotDog
Гость
« Ответ #9 : Май 31, 2010, 20:10 »

Цитировать
я решил исключая её, это делается с ключом -no-gtkstyle
дополнительно добавил -no-qlib

попробовал запустить прогу в CentOS и получил след. ошибку:

Цитировать
./QLMA: /lib/libc.so.6: version `GLIBC_2.9' not found (required by ./QLMA)
./QLMA: /lib/libc.so.6: version `GLIBC_2.10' not found (required by ./QLMA)
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Июнь 01, 2010, 00:01 »

Цитировать
я решил исключая её, это делается с ключом -no-gtkstyle
дополнительно добавил -no-qlib

попробовал запустить прогу в CentOS и получил след. ошибку:

Цитировать
./QLMA: /lib/libc.so.6: version `GLIBC_2.9' not found (required by ./QLMA)
./QLMA: /lib/libc.so.6: version `GLIBC_2.10' not found (required by ./QLMA)


Собирать желательно на более старой версии glibc. Если собирать на новой, на старой может и не запуститься
Записан
garryHotDog
Гость
« Ответ #11 : Июнь 01, 2010, 06:10 »

так я же в своем проекте не использую Glib и при сборке QT ставлю -no-qlib -no-gtkstyle !? откуда зависимость то появляется?
Записан
michael1960
Гость
« Ответ #12 : Июнь 01, 2010, 07:00 »

так я же в своем проекте не использую Glib и при сборке QT ставлю -no-qlib -no-gtkstyle !? откуда зависимость то появляется?

Видите ли, glib и glibc, разные библиотеки, вторая это системные библиотеки. Раз у вас такая ситуация, то я думаю что в этой дистрибуции, сами системные библиотеки не статические, тогда придётся перекомпилировать и glibc, как статическую. Другого мне в голову не преиходит.

Это раз, во вторых, эсли вы компилируете на 32 битовой платфоме, а пытаетесь запустить на 64 битовой, тоже не получится, в данном случае, надо скомпилировать на 64 битовой платфоме, обратная ситуация тоже не получится.
« Последнее редактирование: Июнь 01, 2010, 07:09 от michael1960 » Записан
garryHotDog
Гость
« Ответ #13 : Июнь 01, 2010, 09:38 »

Правильно ли я понял? Glibc собрана у меня как shared,а мне ее нужно пересобрать как static? Если да, то у меня возник ряд вопросов:
1 - как это сделать (думую в гугле найду)
2 - что-нибудь нужно будет менять в проекте?например, указывать пути к библиотекам
3 - и не рухнет ли ubuntu после сборки? это же по идее системная библиотека?
4 - и будет ли прога работать в системах с более раннеми версиями glibc?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #14 : Июнь 01, 2010, 14:00 »

Может это поможет http://easy-coding.blogspot.com/2009/03/unix.html
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.079 секунд. Запросов: 22.