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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как собрать приложение без зависимостей?  (Прочитано 5994 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« : Ноябрь 07, 2009, 09:17 »

Ну в общем вопрос в теме.

Я собрал программу myprog. ldd показал много зависимостей, среди них "libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb7f65000)". При переносе на др эвм могут возникнуть проблемы. Есть наверно много решения этой проблемы, но мне интересны следующие 2 варианта:

1) Собрать приложение так, чтоб всё, что нужно программе myprog от libpng12 вкомпелялось в  myprog. Попробывал сделать так: создал копию библиотеки libpng12.so.0 и добавил список индексов
Код:
 #ar cr /mylibs/libmypng.a /usr/lib/libpng12.so.0
#ranlib /mylibs/libmypng.a
Затем залез в Makefile, который был создан qmake-ом. в нем строчка
Код:
LIBS          = $(SUBLIBS)  /usr/local/Trolltech/Qt4.5.3-static/lib /usr/local/lib/boost-1_35/debug/link-static/threading-multi/libboost_thread-gcc34-mt-d.a /usr/local/lib/boost-1_35/debug/link-static/threading-multi/libboost_system-gcc34-mt-d.a /usr/local/lib/boost-1_35/debug/link-static/threading-multi/libboost_date_time-gcc34-mt-d.a -lQtSvg -L/usr/local/Trolltech/Qt4.5.3-static/lib -L/usr/X11R6/lib -pthread -pthread -pthread -pthread -pthread -pthread -pthread -pthread -lQtXml -pthread -pthread -lQtGui -pthread -lpng -lfreetype -lSM -lICE -pthread -pthread -lXrender -lfontconfig -lXext -lX11 -lQtNetwork -pthread -pthread -lQtCore -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread
 заменил в нем либпнг12 на свою
Код:
LIBS          = $(SUBLIBS)  -L/mylibs/libmypng.a -L/usr/local/Trolltech/Qt4.5.3-static/lib /usr/local/lib/boost-1_35/debug/link-static/threading-multi/libboost_thread-gcc34-mt-d.a /usr/local/lib/boost-1_35/debug/link-static/threading-multi/libboost_system-gcc34-mt-d.a /usr/local/lib/boost-1_35/debug/link-static/threading-multi/libboost_date_time-gcc34-mt-d.a -lQtSvg -L/usr/local/Trolltech/Qt4.5.3-static/lib -L/usr/X11R6/lib -pthread -pthread -pthread -pthread -pthread -pthread -pthread -pthread -lQtXml -pthread -pthread -lQtGui -pthread -lfreetype -lSM -lICE -pthread -pthread -lXrender -lfontconfig -lXext -lX11 -lQtNetwork -pthread -pthread -lQtCore -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread
в результате сборки приложения myprog такие ошибки
Код:
...
/usr/local/Trolltech/Qt4.5.3-static/lib/libQtGui.a(qpnghandler.o): In function `qpiw_write_fn':
qpnghandler.cpp:(.text+0x234): undefined reference to `png_get_io_ptr'
qpnghandler.cpp:(.text+0x267): undefined reference to `png_error'
/usr/local/Trolltech/Qt4.5.3-static/lib/libQtGui.a(qpnghandler.o): In function `QPngHandlerPrivate::readImageFormat()':
qpnghandler.cpp:(.text+0x2c0): undefined reference to `png_get_valid'
qpnghandler.cpp:(.text+0x2f9): undefined reference to `png_get_valid'
qpnghandler.cpp:(.text+0x335): undefined reference to `png_set_strip_16'
qpnghandler.cpp:(.text+0x351): undefined reference to `png_get_valid'
qpnghandler.cpp:(.text+0x37f): undefined reference to `png_set_packing'
qpnghandler.cpp:(.text+0x391): undefined reference to `png_read_update_info'
qpnghandler.cpp:(.text+0x3d7): undefined reference to `png_get_IHDR'
/usr/local/Trolltech/Qt4.5.3-static/lib/libQtGui.a(qpnghandler.o): In function `iod_read_fn':
qpnghandler.cpp:(.text+0x40e): undefined reference to `png_get_io_ptr'
qpnghandler.cpp:(.text+0x454): undefined reference to `png_error'
/usr/local/Trolltech/Qt4.5.3-static/lib/libQtGui.a(qpnghandler.o): In function `QPngHandler::~QPngHandler()':
qpnghandler.cpp:(.text+0x7b4): undefined reference to `png_destroy_read_struct'
/usr/local/Trolltech/Qt4.5.3-static/lib/libQtGui.a(qpnghandler.o): In function `set_text(QImage const&, png_struct_def*, png_info_struct*, QString const&)':
qpnghandler.cpp:(.text+0xffd): undefined reference to `png_set_text'
/usr/local/Trolltech/Qt4.5.3-static/lib/libQtGui.a(qpnghandler.o): In function `QPNGImageWriter::writeImage(QImage const&, int, QString const&, int, int)':
qpnghandler.cpp:(.text+0x12fa): undefined reference to `png_create_write_struct'
qpnghandler.cpp:(.text+0x132b): undefined reference to `png_set_error_fn'
qpnghandler.cpp:(.text+0x1336): undefined reference to `png_create_info_struct'
qpnghandler.cpp:(.text+0x1389): undefined reference to `png_set_compression_level'
qpnghandler.cpp:(.text+0x13ce): undefined reference to `png_set_write_fn'
qpnghandler.cpp:(.text+0x1492): undefined reference to `png_set_IHDR'
qpnghandler.cpp:(.text+0x152d): undefined reference to `png_set_PLTE'
qpnghandler.cpp:(.text+0x161c): undefined reference to `png_set_bgr'
qpnghandler.cpp:(.text+0x164b): undefined reference to `png_set_sig_bytes'
qpnghandler.cpp:(.text+0x168f): undefined reference to `png_set_pHYs'
qpnghandler.cpp:(.text+0x16b7): undefined reference to `png_write_info'
qpnghandler.cpp:(.text+0x16cf): undefined reference to `png_set_packing'
qpnghandler.cpp:(.text+0x1764): undefined reference to `png_write_chunk'
qpnghandler.cpp:(.text+0x17aa): undefined reference to `png_get_IHDR'
...

...
qpnghandler.cpp:(.text+0x31e6): undefined reference to `png_set_strip_16'
qpnghandler.cpp:(.text+0x31f4): undefined reference to `png_set_gray_to_rgb'
qpnghandler.cpp:(.text+0x328c): undefined reference to `png_read_update_info'
/usr/local/Trolltech/Qt4.5.3-static/lib/libQtGui.a(qpnghandler.o): In function `QPngHandler::~QPngHandler()':
qpnghandler.cpp:(.text+0x34d4): undefined reference to `png_destroy_read_struct'
/usr/local/Trolltech/Qt4.5.3-static/lib/libQtGui.a(qpnghandler.o): In function `QPngHandler::~QPngHandler()':
qpnghandler.cpp:(.text+0x3574): undefined reference to `png_destroy_read_struct'
collect2: ld returned 1 exit status
make[1]: *** [../bin/nova] Error 1
make: *** [sub-src-make_default] Error 2
*** Завершено с кодом: 2 ***
я так понял что линкер не нашел функции из libpng12. Что я делаю не так?

2) Второй вариант - это оставить библиотеки подгружаемые, но чтоб эти библиотеки брались не из /usr/lib, а разместить их в папке с приложением и указать линкеру что, этот png12 лежит в "рабочей_дериктории_myprog/libs" Т.е. всё что нужно моей программе будет у неё, и не будет зависить от установленных пакетов в системе. ну и чтоб ldd показал что-то нечто "libpng12.so.0 => /opt/myprog/lids/libpng12.so.0" или еще лучше "libpng12.so.0 => ./lids/libpng12.so.0". Я этот вариант тоже пробовал, удалил в Makefile "-lpng12" и в самом начала строки с либами прописал
Код:
LIBS          = $(SUBLIBS)  /opt/myprog/libs lpng12 ...
в результате ldd показывает зависимость "libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb7f65000)"

В общем есть ли у кого практический опыт подобных сборок? подскажите, что я делаю не так?

ps речь идет о *nix ос. А всё это делал в Debian 5.0.2
« Последнее редактирование: Ноябрь 07, 2009, 09:18 от juvf » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Ноябрь 07, 2009, 14:31 »

ИМХО, не нужно ничего статически собирать.

Я, если честно, устал уже от повторения одного и того-же правила (концепции) *.nix :
мухи должны быть отдельно от котлет!!!

Если та планируешь распростанять прогу под Дебиан - то , будь добр, собери дебовский пакет из своей проги, в зависимостях которого укажи libpng . И тогда тот человек, который будет устанавливать твой пакет - сразу поймет, есть ли у него нужные библиотеки или нет, т.к. менеджер пакетов дебиана скажет человеку о том, что ему необходимо доустановить еще какие-то библиотеки по зависимостям.

Если собираешься распространять для других дистрибутивов - то тут нужно кого-то просить, стобы он собрал пакет для конкретного дистрибутива и т.п. Или же - просто создал специальный файл типа SPEC и т.п.

Я, допустим могу помочь в создании "спека" PKGBUILD для ArchLinux ...

В общем, думаю, идея ясна. Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Ноябрь 07, 2009, 16:53 »

подскажите, что я делаю не так?

пытаешься применить windows-way в Linux. В Linux принято собирать пакеты под дистрибутивы, хотя бы с помощью checkinstall
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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