【问题标题】:autools, libtool and -Wl,-whole-archiveautools、libtool 和 -Wl、-whole-archive
【发布时间】:2016-10-12 08:33:07
【问题描述】:

我有一个与this question 非常相似的问题。我需要告诉链接器添加静态库,尽管似乎要引用它的符号。 原因是该库在 .init 中包含一个函数或使用 (__attribute__ ((constructor))) 来执行其初始化,这反过来将从主程序调用 register() 函数来注册其功能(读取: 传递其他函数指针)。

因此,尽管在主程序中似乎没有使用库中的符号,但一旦通过库 init 函数注册了库中的函数,主程序就会调用库中的函数。

但我正在使用 libtool... 因此,以前面提到的问题中给出的示例为例,我需要编写如下内容:

bin_PROGRAMS = pktanon 
pktanon_SOURCES = main.cpp
pktanon_DEPENDENCIES = $(lib_LIBRARIES)
pktanon_LDADD = libpktanon.la $(LDADD) 

注意 lib 的“la”扩展名而不是“a”。

现在,我应该如何将--whole-archive 选项传递给链接器? the question 中建议的答案假定存档的路径(.a 文件)是已知的......在 Makefile.am 中硬编码像 .libs/libptanon.a 这样的路径感觉不对...... 如果尝试,链接器不喜欢在其整个存档选项中遇到.la 文件:

pktanon_LDFLAGS = -Wl,--whole-archive,libpktanon.la,--no-whole-archive

有什么建议吗?

【问题讨论】:

    标签: ld autotools libtool


    【解决方案1】:

    --whole-archive 的使用是不可移植的,那么为什么不创建一个 Libtool 便利库呢?在您的 Automake Makefile.am 中,将 noinst_ 添加到库中,而不是创建(可能是非 pic)静态存档,它将获取库中的所有目标文件并将其添加到链接到它的任何内容中。它是可移植的,应该适用于这种情况,因为您似乎根本不想要一个库。

    【讨论】:

    • 问题是我的 lib 使用来自主程序的符号,而不是相反:autotools 假设便利库 L 定义了主程序 P 引用的符号:autotools 会将 P 和 L 传递给链接器, 按此顺序。如果没有 --whole-archive(或 --start-group)选项,链接器将不会“交叉链接”L 和 P。在我的情况下,L 指的是 P 中的符号:P 定义了 L 引用的符号,即与 autotools 假设相反。这家伙也有同样的问题:lists.gnu.org/archive/html/automake/2006-03/msg00042.html 见第二点(动机)第 3 节。
    • 如果你修复你的设计使其不是循环的,你会更好 - 或者只是将你的“库”视为目标文件的集合,不要试图将它们放在存档中.例如,这样的设计无法移植到 Windows。
    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2010-10-22
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多