gpt4 book ai didi

c - Autoconf:链接器错误链接自定义库

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:08 24 4
gpt4 key购买 nike

1) 我有一个包含共享库的项目,该共享库链接到一些外部库(即 gcryptgpg-errorzssh2)。让我们称之为“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 方面不是很聪明,抱歉。

注意:我正在使用(还旧的)ELDK 3.1 为 PowerPC 进行交叉编译。

最佳答案

注意:由于我在 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:

prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@

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

libMyLib-1.0-uninstalled.pc:

prefix=@abs_builddir@
exec_prefix=@exec_prefix@
libdir=${prefix}/.libs
includedir=${prefix}

Name: MyLib
Description: My library.
Requires: libssh2
Requires.private:
Version: @PACKAGE_VERSION@
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)

关于c - Autoconf:链接器错误链接自定义库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9434533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com