Ну в общем вопрос в теме.
Я собрал программу 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