【问题标题】:Libtool and -no-undefined?Libtool 和 -no-undefined?
【发布时间】:2021-10-01 14:11:11
【问题描述】:

我见过Passing "-no-undefined" to Libtool LDFLAG;我在那里尝试了所有方法,但不幸的是我无法让它工作。

这是我的问题:我正在尝试在 Cygwin64 下构建 liblo。我所做的只是:

wget http://downloads.sourceforge.net/liblo/liblo-0.31.tar.gz
tar xzvf liblo-0.31.tar.gz
cd liblo-0.31
./configure
make

编译通过没有问题,然后链接阶段来了,我得到:

  CCLD     liblo.la
libtool:   error: can't build x86_64-unknown-cygwin shared library unless -no-undefined is specified
make[3]: *** [Makefile:728: liblo.la] Error 1

这里是Makefile.am;我试过在那里插入:

AM_LIBTOOLFLAGS = -no-undefined
AM_LDFLAGS = -no-undefined

...然后运行:

automake
./configure
make

...但这无济于事,我得到了同样的错误。

请注意,这里可能会有额外的混淆:根据stunnel build chokes on -no-undefined - Cygwin-apps mailing list

有 GNU ld 标志 --no-undefined(两个破折号),还有 libtool 标志 -no-undefined(一个破折号)。它们不一样,并且拼写出来 -no-undefined 不会使 libtool 向链接器提供 --no-undefined 。 libtool 也不查找 -Wl,--no-undefined。 -Wl,-no-undefined 似乎是 一些混乱的混合体。

那么,我如何/在哪里添加这个-no-undefined 开关到这个项目中?

【问题讨论】:

  • 通常在 Makefile.am 中添加liblo_la_LDFLAGS = -no-undefined

标签: cygwin autotools libtool


【解决方案1】:

嗯,所以我查看了 Makefile,试图查找所有可能的 *FLAGS 并设置它们,最后我注意到其中有一个 LDFLAGS = 行 - 我只是尝试了一下:

make LDFLAGS=-no-undefined

...并且链接通过了 - 我觉得很奇怪,因为我认为这与 OP 中发布的引用直接矛盾?!

好吧,无论如何 - 如果有人有更直接的技术来处理这个问题,请随时发布 - 这只是反复试验......

【讨论】:

  • 您描述的行为与问题中的引用不冲突。 Libtool 会看到LDFLAGS 中表达的标志,这是需要的,而quotatoin 没有说相反的东西。我很高兴你设法让它工作!
【解决方案2】:

您提供的诊断来自 Libtool,要求您将其 -no-undefined 选项传递给它。那么如何做到这一点呢?

在涉及 Libtool 的构建中,libtool 可执行文件在构建的多个阶段运行,包括但不限于编译和链接。当它被调用时,它会获得该构建阶段的完整标志集,并从那些对其特别有意义的标志中进行选择。尽管 Automake 还提供了LIBTOOLFLAGSAM_LIBTOOLFLAGS,但它们是针对所谓的通用选项,而不是特定于模式的选项。这在the Automake manual 中进行了讨论。

那么,如何/在哪里添加这个-no-undefined 开关到这个项目中?

由于 Libtool 的 -no-undefined 是链接模式选项,LDFLAGS 变量之一是传达它的正确方式。如果您只是尝试构建项目,而不是维护其构建系统,那么LDFLAGS 就是其中之一,被指定为用户变量。自动工具不应向其添加任何标志,因为它的全部目的是作为构建器传递额外链接器标志的工具,这正是您想要做的。

configuremake 命令行上为该变量指定一个值是正确的方法。我没有足够的详细信息来确定您尝试的其他方法为何不成功,但您最终找到了正确的地方

make LDFLAGS=-no-undefined

从您的自我回答来看,这似乎让您感到意外。我想这是由于对您引用的 cmets 的含义和含义的误解造成的。是的,ld--no-undefined 选项和libtool-no-undefined 选项是独立的选项。是的,后者并不意味着前者。所以呢?后者是您想要的,因此您只需指定它。如果你想要前者,那么你会指定它。引用的注释的重点是,您需要注意为您想要的拼写使用正确的拼写,或者如果您想要两者都给出。这与哪个 Automake 变量适合传达这些标志无关。

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多