13

我正在用 autoconf、automake 和 libtool 构建一个程序。我的工作要求我静态链接(大多数)库。这在过去不是问题,因为我可以将所有内容与 -all-static. 现在这是一个问题,因为我必须使用一个只有动态的库;它是由第三方提供给我们的,我们没有来源。

当然,-all-staticnow 会导致构建失败。是否可以告诉 libtool 静态链接除这个库之外的所有内容?是否有可能让 libtool 进行静态和动态链接的任何组合,或者是全部还是全部?

到目前为止,我已经尝试使用 . 创建一个便利库LDFLAGS = -static,这取决于我要静态链接的库。但是 libtool 并没有像我希望的那样连接静态库。依赖于便利库的程序仍然动态链接所有内容。

我也试过--disable-shared了,但这并不影响构建。


这些问题很相似,但并没有真正回答我的问题:

使用 Libtool 强制将静态库链接到共享库

是否可以使用 libtool 静态链接一些(但不是全部)库?

(我不想从我的系统中删除共享库,并且为所有内容指定完整路径几乎不比手动链接好,但也许这是唯一的方法。)

4

2 回答 2

12

您没有指定操作系统,但让我们假设它是相对较新的 Unix/Linux/OSX。如果不是,则忽略以下警告。

在我回答之前,您应该知道在大多数基于 ELF 的系统(Unix/Linux)上混合静态代码和共享代码是有问题的。一个原因是,如果您忘记重新链接更新的依赖项,可能会导致代码不同步。另一个是由于静态代码与PIC的性质。这就是 libtool 试图阻止它的原因。

话虽如此,在 Makefile.am 中(假设您的最终程序是foo并且共享库是):

    .
    .
    .
    foo_SOURCES = foo.c abc.c def.c hij.c
    foo_LDFLAGS = -all-static -Wl,-Bdynamic,-L/path/to,-lshared,-Bstatic
    foo_LDADD = -L../path/to -lbar -lbaz

这里重要的是 libtool 允许您通过将参数直接传递给链接器 (GNU ld)来缩短检查和 GNU gcc 的-static标志(由 libtool 使用)。-Wl,要在参数之间放置空格,请使用逗号,分隔符。

两者-Bstatic-Bdynamic都记录在 GNU ld 的信息页面以及帮助屏幕中。同样,由于您没有提到正在使用的 os 或编译器包,我假设在 Linux 上使用 GNU gcc 和 GNU ld。您可能需要使用ld --helpto see for yourself 来验证。如果由于某种原因它不是 GNU ld,那么您将需要找到与 and 等效的标志,-Bstatic-Bdynamic在适当的地方进行替换。

于 2012-12-25T03:45:52.893 回答
0

就我而言,我想labA静态链接,但pthread动态链接。如果我添加libAMakefile.amas

my_proc_LDADD = -Wl,-Bstatic -lA -Wl,-Bdynamic

然后ldd无法链接libAlibA应该指定 in LDADD,但 autotools 不允许这样做。

如果我添加到Makefile.am LDADD评论

#my_proc_LDADD = -Wl,-Bstatic -lA -Wl,-Bdynamic

然后它也会Makefile作为注释添加到结果中所以我只是在configure脚本之后取消注释这个字符串:

./configure
sed -i -e 's/#my_proc_LDADD/my_proc_LDADD/g' ./src/Makefile
make

结果,静态链接libA被附加到LDADD

于 2019-11-02T19:14:55.483 回答