2012-02-24 83 views
1

1)我有一个项目包含一个共享库,链接到一些外国库(即gcrypt,gpg-error,zssh2)。让我们称它为“mylib”。 这个库完全建立,我可以看到libtool正确连接的依赖关系。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程序? – 2012-02-26 13:41:46

+0

我有'program1_CPPFLAGS = -I $(top_srcdir)$(MYLIB_CFLAGS)''',其中'MYLIB_CFLAGS'和'MYLIB_LIBS'在'program1的'configure.ac'中用'AC_ARG_WITH'定义,以允许我链接到一个当地的“mylib”,而不是安装了一个系统(请告诉我,这是否是一个更好的方法)。 – j4x 2012-02-27 13:43:47

+0

CPPFLAGS不应该是相关的,但是如何在Makefile.am中使用MYLIB_LIBS?在最终的Makefile中,应该有一个包含$(LINK)命令的program1 $(EXEEXT)的目标,并且该命令应该有$(LIBS),如果AC_SEARCH_LIBS成功找到给定的库,该命令应包含库。 – 2012-02-27 14:07:48

回答

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

除非'libslog'或标准库也位于不同的路径中,否则不应在Libs条目中需要'-rpath-link'。 – 2014-07-25 13:13:11

+0

是的,它在'uninstalled'配置文件中位于不同的路径中。谢谢! – j4x 2014-07-28 11:21:04

0

这是很难告诉你不知道什么是你Makefile.amconfigure.ac做什么,但因为我看到你正在使用-Wl,-rpath,我认为你是从外面把它当作LDFLAGS当你调用./configure

发生什么是libtool通常不会存储-rpath值,但它会存储-L;所以我通常的建议是通过两种-L-rpath使得.la文件将包含路径在哪里可以找到链接到它的库。

虽然你不必通过它的每一个二进制,libtool会,并将然后让链接器解析正确。

+0

真的非常感谢你回答迭戈。我最终通过放置'pkgconfig'来解决我的问题。现在我不必为每个依赖关系重复链接库。但令人失望的是,'autoconf'不能自动“级联”这种依赖关系...... – j4x 2014-07-24 12:47:39

+0

您只能级联共享对象依赖关系,但不能静态存档,但在这种情况下,在我看来,您似乎有一些额外的依赖关系完全处于不同的路径中,而且由于其搜索路径发生变化,因此更加棘手。 – 2014-07-25 13:14:28

+0

令人讨厌的想法是,我不得不在共享项目中重复依赖(共享)库。尽管'MyLib'已经被动态链接,如果我省略(已经在MyLib中链接)的依赖关系,最终的程序/库会给出链接器错误。 – j4x 2014-07-28 11:25:05