如何链接到libabc.a而不是libabc.so?

时间:2011-11-08 03:46:24

标签: build build-process automake libtool

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

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

因此,作者再次修改Makefile.am,使用libtool构建libjupcommon.lalibjupiter的{​​{1}}链接。 像这样:

  

noinst_LTLIBRARIES = libjupcommon.la

     

libjupcommon_la_SOURCES = jupcommon.h print.c

  

...

     

libjupiter_la_LIBADD = ../ common / libjupcommon.la

这一切都没问题。


现在,我的问题:

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

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

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

PS:从book's official site下载示例。在.a中,修改Makefile.am的autotools/book/jupiter-libtool-ch6/commonnoinst_LTLIBRARIES应该与我的问题非常接近。

2 个答案:

答案 0 :(得分:2)

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

编辑:由于需要静态和共享库,以上操作无效。

尝试添加:

AC_CHECK_LIB([abc],[some_function_in_libabc])

to configure.ac。

答案 1 :(得分:1)

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

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

将上面的$ 1替换为您的图书馆名称。

解释:上面的大多数怪物都是为了解决libtool将重新安排命令行参数的事实,这是非常有帮助的。使用-Xlinker将强制libtool忽略-l $ 1而不重新排列它。 -Wl,-Bstatic告诉链接器将所有后续库链接为静态。 -Wl,-Bdynamic切换回动态链接以进一步库。