1

Autotools: A Practioner's Guide to GNU Autoconf, Automake, and Libtool一书中,第 6 章(使用 libtool 构建库)中给出了链接库的示例

在示例中,一个库libjupiter.so链接到另一个库libjupcommon.a。第一次尝试失败,因为libjupiter.so需要 PIC,但libjupcommon.a不是。作者添加libjupcommon_a_CFLAGS = -fPIC以修复它。它变得更好了,但是'将共享库 libjupiter.la 与静态库 ../common/libjupcommon.a 链接起来的警告不可移植!'出现。

因此作者再次修改了 Makefile.am 的,使用 libtool 来构建libjupcommon.la。的libjupiter链接libjupcommon.la。像这样:

noinst_LTLIBRARIES = libjupcommon.la

libjupcommon_la_SOURCES = jupcommon.h print.c

...

libjupiter_la_LIBADD = ../common/libjupcommon.la

这次一切正常。


现在,我的问题:

我有一个图书馆需要另一个图书馆,就像libjupiter需要一样libjupcommon。不同之处在于我libjupcommon来自另一个项目并安装到系统中。它不是一个noinst_LTLIBRARIES. .so.a版本都存在。当我尝试链接libjupcommon.la示例显示的内容时,.so选择了 ,但我不想要动态链接关系。我想链接到.a,就像书中的例子一样。

显式链接.a(通过使用 _LIBADD=.a 文件)提供了一个可用的库,但给出了“...不可移植”的警告。

.a在这种情况下实现链接的正确方法是什么?

PS:从本书的官方网站下载示例。在autotools/book/jupiter-libtool-ch6/common中,将 Makefile.am 修改noinst_LTLIBRARIESlib_LTLIBRARIES应该与我的问题非常相似。

4

2 回答 2

2

您可以尝试几件事。您可以尝试使用关闭共享库编译configure的选项运行(并再次添加静态库)。您可以尝试添加to以获取 libtool 以静态构建它(再次将静态库添加到)。--disable-sharedlibfoo_LIBADD-staticlibfoo_LDFLAGSlibfoo_LIBADD

编辑:由于需要静态库和共享库,因此上述方法不起作用。

尝试添加:

AC_CHECK_LIB([abc],[some_function_in_libabc])

配置.ac。

于 2011-11-08T05:28:05.217 回答
2

您可以使用此构造强制静态链接到一个库(同时保持所有其他链接共享):

-Wl,-Bstatic -Wl,-whole-archive -Xlinker -l$1 -Wl,-no-whole-archive -Wl,-Bdynamic

将上面的 $1 替换为您的库名称。

说明:上述大部分怪事都是为了绕过 libtool 将重新排列命令行参数这一事实,这非常有帮助。使用 -Xlinker 将强制 libtool 忽略 -l$1 并且不重新排列它。-Wl,-Bstatic 告诉链接器将所有以下库链接为静态。-Wl,-Bdynamic 切换回动态链接以获取更多库。

于 2015-04-10T14:48:25.547 回答