1) У меня есть проект, содержащий разделяемую библиотеку, которая ссылается на некоторые сторонние библиотеки (а именно gcrypt
, gpg-error
, z
и ssh2
). Назовем это "mylib". Эта библиотека отлично строится, и я вижу, что libtool
правильно связывает зависимости.
libtool: link: ppc-linux-gcc -shared -fPIC -DPIC .libs/mylib1.o .libs/mylib2.o .libs/mylib3.o
-Wl,-rpath -Wl,/opt/ELDK/ppc_8xx/lib -Wl,-rpath \
-Wl,/opt/ELDK/ppc_8xx/lib /opt/ELDK/ppc_8xx/lib/libssh2.so \
-L/opt/ELDK/ppc_8xx/lib -lz /opt/ELDK/ppc_8xx/lib/libgcrypt.so \
/opt/ELDK/ppc_8xx/lib/libgpg-error.so -lpthread -O2 \
-Wl,-soname -Wl,mylib.so.0 -o .libs/mylib.so.0.0.0
2) В этом же проекте есть несколько программ, ссылающихся на "mylib". Однако, когда я пытаюсь связать их, я получаю ошибки компоновщика о тех же предыдущих библиотеках:
/opt/ELDK-3.1/usr/bin/../lib/gcc-lib/ppc-linux/3.3.3/../../../../ppc-linux/bin/ld: \
warning: libssh2.so.1, needed by ./../myLib/.libs/mylib.so, not found (try using -rpath or -rpath-link)
/opt/ELDK-3.1/usr/bin/../lib/gcc-lib/ppc-linux/3.3.3/../../../../ppc-linux/bin/ld: \
warning: libz.so.1, needed by ./../myLib/.libs/mylib.so, not found (try using -rpath or -rpath-link)
/opt/ELDK-3.1/usr/bin/../lib/gcc-lib/ppc-linux/3.3.3/../../../../ppc-linux/bin/ld: \
warning: libgcrypt.so.11, needed by ./../myLib/.libs/mylib.so, not found (try using -rpath or -rpath-link)
/opt/ELDK-3.1/usr/bin/../lib/gcc-lib/ppc-linux/3.3.3/../../../../ppc-linux/bin/ld: \
warning: libgpg-error.so.0, needed by ./../myLib/.libs/mylib.so, not found (try using -rpath or -rpath-link)
./../myLib/.libs/mylib.so: undefined reference to `libssh2_channel_process_startup'
./../myLib/.libs/mylib.so: undefined reference to `libssh2_scp_send_ex'
В "mylib" configure.ac
я явно ищу библиотеки:
AC_SEARCH_LIBS(gpg_err_set_errno,[gpg-error])
AC_SEARCH_LIBS(gcry_check_version,[gcrypt])
AC_SEARCH_LIBS(deflate,[z])
AC_SEARCH_LIBS(libssh2_init,[ssh2])
Должен ли я также явно включать все эти библиотеки в каждый проект, используя «mylib»? Разве это не должно быть уже решено, когда я впервые связываю их в «mylib»?
Есть ли лучший способ сделать это?
Спасибо.
P.S.: Я не очень разбираюсь в autoconf
вопросе, извините.
ПРИМЕЧАНИЕ. Я выполняю кросс-компиляцию для PowerPC, используя (еще старый) ELDK 3.1.
program1_CPPFLAGS = -I$(top_srcdir) $(MYLIB_CFLAGS)
, гдеMYLIB_CFLAGS
иMYLIB_LIBS
определены с помощьюAC_ARG_WITH
вconfigure.ac
программы1, чтобы я мог ссылаться на локальную mylib вместо установленной в системе (пожалуйста, скажите мне, если это лучший способ сделать это). - person j4x   schedule 27.02.2012readelf -a
, чтобы убедиться, что RPATH действительно добавлен, как вы просили. - person rra   schedule 17.03.2013