2011-11-08 47 views
1

在书Autotools: A Practioner's Guide to GNU Autoconf, Automake, and Libtool的第6章(使用libtool构建库)中,给出了链接库的example如何链接到libabc.a而不是libabc.so?

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

因此,作者再次修改Makefile.am,使用libtool构建libjupcommon.lalibjupiter链接到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的正确方法是什么?请参考book's official site。在autotools/book/jupiter-libtool-ch6/common中,将Makefile.am的noinst_LTLIBRARIES修改为lib_LTLIBRARIES应该与我的问题很接近。

+0

你想建立什么样的图书馆?共享库或静态库?如果您正在构建共享库,那么与已安装的'.a'库链接是没有意义的,因此libtoool警告。如果你正在构建一个静态库,你应该明确声明(参见ldav1s的答案)。 – adl

+0

我想建立一个共享库。即使安装的'.a'是PIC也没有意义?为什么这样? –

+0

但是在这种情况下,'.a'不是由Libtool生成的。据我所知,Libtool安装的'.a'文件不是PIC。 – adl

回答

2

有几件事你可以尝试。您可以尝试运行configure--disable-shared选项以关闭共享库的编译(并再次将静态库添加到libfoo_LIBADD)。您可以尝试添加-staticlibfoo_LDFLAGS以使libtool静态构建(再次将静态lib添加到libfoo_LIBADD)。

编辑:由于需要静态和共享库,上述将无法正常工作。

尝试增加:

AC_CHECK_LIB([abc],[some_function_in_libabc]) 

到configure.ac。

+0

你的意思是只编译静态的?我认为它会起作用。但我需要静态和动态'libjupcommon';并使'libjupiter.so'链接静态的。 –

+0

noinst_LTLIBRARIES是便利库,旨在在构建过程中与某些可执行文件或其他库重新链接。 – ldav1s

+0

阅读libtool的代码后,我确信建立一个静态唯一的库是我应该做的。像libfoo.so,libfoo.a libfoo_static.a。谢谢ldav1s。 –

1

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

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

更换超过$ 1你的库名。

说明:上述大部分怪物都是为了解决libtool会重新安排命令行参数这一事实,因此非常有帮助。使用-Xlinker将强制libtool忽略-l $ 1,而不是重新排列它。 -Wl,-Bstatic指示链接器将所有以下库链接为静态。 -Wl,-B动态切换回到动态链接进一步库。

相关问题