2012-02-24 5 views
1

1) У меня есть проект, содержащий общую библиотеку, связанную с некоторыми зарубежными библиотеками (а именно gcrypt, gpg-error, z и ssh2). Давайте назовем это «mylib». Эта библиотека прекрасно строится, и я могу видеть, как правильно связывать зависимости.Autoconf: ссылка на ошибку, связанная с пользовательской библиотекой

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.

+0

ли вы переопределить любого из директив для вашей программы в Makefile.am? –

+0

У меня есть что-то вроде 'program1_CPPFLAGS = -I $ (top_srcdir) $ (MYLIB_CFLAGS)' где 'MYLIB_CFLAGS' и' MYLIB_LIBS' определены с 'AC_ARG_WITH' в' configure.ac' из 'program1', чтобы я мог ссылаться на локальный «mylib» вместо установленной системы (скажите, пожалуйста, если это лучший способ сделать это). – j4x

+0

CPPFLAGS не должны быть релевантными, но как вы используете MYLIB_LIBS в Makefile.am? В вашем окончательном Makefile должна быть цель для program1 $ (EXEEXT), которая содержит команду $ (LINK), и эта команда должна иметь $ (LIBS), которая должна содержать библиотеки, если AC_SEARCH_LIBS удалось найти данную библиотеку. –

ответ

1

ПРИМЕЧАНИЕ: Поскольку я получил ответ на 2 года, и это не помогло решить мою проблему, я думаю, что лучше поделиться со всеми тем, что я сделал.


ОТВЕТ:

Лучший способом я нашел, чтобы автоматически включать в зависимость компоновщика в проекте на основе autoconf, чтобы добавить pkg-config информации в библиотеку.

Изменение configure.ac:

export PKG_CONFIG_PATH=../MyLibPath:${PKG_CONFIG_PATH} 
PKG_CHECK_MODULES([DEPS], [libssh2 >= 1.3.0]) 

# Output configuration files. 
AC_CONFIG_FILES([Makefile libMyLib-1.0.pc libMyLib-1.0-uninstalled.pc]) 

Второй выходной файл libMyLib-1.0-uninstalled.pc, чтобы позволить мне продолжать развивать свой проект с неустановленной версией MyLib.

Изменения Makefile.am:

libMyLib_la_CPPFLAGS = $(DEPS_CPPFLAGS) 
libMyLib_la_CFLAGS = $(DEPS_CFLAGS) 
libMyLib_la_CXXFLAGS = $(DEPS_CXXFLAGS) 
libMyLib_la_LIBADD = $(DEPS_LIBS) 

pkgconfigdir = $(libdir)/pkgconfig 
pkgconfig_DATA = libMyLib-1.0.pc 

Добавить в проект libMyLib-1.0.pc:

[email protected]@ 
[email protected][email protected] 
[email protected]@ 
[email protected]@ 

Name: MyLib 
Description: My library. 
Requires: libssh2 
Requires.private: 
Version: @[email protected] 
Libs: -L${libdir} -lMyLib -lstdc++ -lm -lslog -lpthread 
Libs.private: 
Cflags: -I${includedir}/libMyLib-1.0 

и libMyLib-1.0-uninstalled.pc:

[email protected][email protected] 
[email protected][email protected] 
libdir=${prefix}/.libs 
includedir=${prefix} 

Name: MyLib 
Description: My library. 
Requires: libssh2 
Requires.private: 
Version: @[email protected] 
Libs: -Wl,-rpath-link,${libdir} -L${libdir} -lMyLib -lstdc++ -lm -lslog -lpthread 
Libs.private: 
Cflags: -I${includedir}/ 

В каждом зависимом проекте:

configure.ac:

export PKG_CONFIG_PATH=../MyLibPath:${PKG_CONFIG_PATH} 
PKG_CHECK_MODULES([MYLIB], [libMyLib-1.0 >= 1.0.0]) 

Makefile.am:

dependent_CPPFLAGS = $(MYLIB_CPPFLAGS) 
dependent_CFLAGS = $(MYLIB_CFLAGS) 
dependent_CXXFLAGS = $(MYLIB_CXXFLAGS) 
dependent_LIBADD = $(MYLIB_LIBS) 
+1

Вам не нужно использовать '-rpath-link' в записи Libs, если только' libslog' или стандартные библиотеки не находятся в разных путях. –

+0

Да, он находится в другом пути в профиле 'uninstalled'. Благодаря! – j4x

0

Труднее сказать точно, что вы делаете, не зная, что в вашем Makefile.am или configure.ac, но так как я вижу, вы используете -Wl,-rpath, я предполагаю, что вы передаете его как LDFLAGS с внешней стороны, когда вы звоните ./configure ,

Случается, что libtool обычно не сохраняет значения -rpath, но он будет хранить -L; поэтому мое обычное предложение состоит в том, чтобы передать как -L, так и -rpath, так что файлы .la будут содержать путь, по которому библиотеки будут ссылаться на него.

Хотя вам не нужно передавать его на каждый отдельный двоичный код, libtool будет, а затем разрешит редактор ссылок правильно его исправить.

+0

На самом деле спасибо за ответ Диего. Я закончил тем, что поставил 'pkgconfig', и он решил мою проблему. Теперь мне не нужно повторять связанные библиотеки для каждой зависимости. Однако неутешительно, что 'autoconf' не может автоматически« каскадировать »эти зависимости ... – j4x

+0

Вы можете только каскадировать общие объектные зависимости, но не статические архивы, но в этом случае мне кажется, что у вас есть дополнительные которая находится в другом пути в целом, и это сложнее, потому что его пути поиска меняются. –

+0

Досадно думать, что мне пришлось постоянно повторять зависимые (общие) библиотеки в общих проектах. Несмотря на то, что 'MyLib' был уже динамически связан, последняя программа/библиотека давала линкерские ошибки, если я опускаю зависимости (уже связанные с MyLib). – j4x