gpt4 book ai didi

autotools - 自动工具用户如何指定静态和动态链接的组合?

转载 作者:行者123 更新时间:2023-12-01 17:19:23 24 4
gpt4 key购买 nike

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

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

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

我也尝试过 --disable-shared,但这并没有影响构建。

<小时/>

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

Force linking a static library into a shared one with Libtool

Is it possible to link some — but not all — libraries statically with libtool?

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

最佳答案

您没有指定操作系统,但让我们假设它是相对较新的 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 允许您通过传递 -Wl, 来短路检查和 GNU gcc 的 -static 标志(由 libtool 使用)参数直接传递给链接器(GNU ld)。要在参数之间添加空格,请使用逗号 , 分隔符。

-Bstatic-Bdynamic 均记录在 GNU ld 的 info pages 中。以及帮助屏幕。同样,由于您没有提到正在使用的操作系统或编译器包,我假设 Linux 上使用 GNU gcc 和 GNU ld。您可能需要使用 ld --help 来亲自查看进行验证。如果由于某种原因,它不是 GNU ld,那么您将需要找到与 -Bstatic-Bdynamic 等效的标志,并在适当的地方进行替换。

关于autotools - 自动工具用户如何指定静态和动态链接的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13997415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com