在书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.la
。 libjupiter
的{{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/common
到noinst_LTLIBRARIES
应该与我的问题非常接近。
答案 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切换回动态链接以进一步库。