如何将共享库与 --as-needed 与 automake 链接?
Posted
技术标签:
【中文标题】如何将共享库与 --as-needed 与 automake 链接?【英文标题】:How do I link a shared library with --as-needed with automake? 【发布时间】:2011-07-27 23:23:11 【问题描述】:如何使用 Automake 将共享库与 --as-needed
链接?当我尝试将标志添加到LDFLAGS
时,我看到libtool
是这样调用的:
/bin/bash ../../libtool --mode=link ... -Wl,--as-needed ... dependencies
这会导致像这样调用 GCC:
gcc -shared ... dependencies ... -Wl,--as-needed ...
但这是错误的顺序。
有没有办法用 Libtool 做到这一点?
或者有没有一种使用 Automake 但不使用 Libtool 构建共享库的好方法? (我过去因为各种其他原因对 Libtool 感到沮丧……)
似乎 Debian 的人也遇到了这个问题 (bug report),但我希望能够为我的项目解决这个问题,而不是弄乱我的系统(除非我误解了修复)。
【问题讨论】:
我希望事情发生了变化,因为您的参考来自 2006 年并提到了libtool
1.5,但似乎没有:sigquit.wordpress.com/2011/02/16/…
是的,我正在运行 libtool 2.2.6。
【参考方案1】:
您可以通过修改项目源代码中的 ltmain.sh 脚本来解决此问题。您甚至可以将其添加为 autotools 引导的一部分,如下所示: https://meego.gitorious.org/tracker/tracker/commit/cf2ca3414aeba146dceacc5ecd84765f4c08a06f
【讨论】:
【参考方案2】:你可以在Makefile.am
修复它;基本上和my question here的答案一样,只是你需要用-(no-)as-needed
而不是-(no-)whole-archive
。
【讨论】:
你能扩展一下吗?问题是把它放在 LDFLAGS 中是行不通的。 嗯,在我看来问题在于它以错误的顺序放入命令行。通过使用打开和关闭行为的选项将命令行上的共享库名称括起来,在我看来它应该在 LDFLAGS 中工作。还是我完全误解了? 问题是当我以正确的顺序将标志传递给 libtool 时,libtool 会重新排序它们。 但是这个解决方案将as-needed
标志和依赖项放在一个不可重新排序的块中,libtool 将其视为一个命令行参数。
好的,但我需要使用来自 Autoconf 的一个大的讨厌变量中的变量来构建命令行,其中包含其他 -Wl
标志。【参考方案3】:
确实是一个令人沮丧的问题,尤其是对于包维护而言。
Debian 已内置支持修补 libtool 并在 debian 软件包中修复此问题
dh_autoreconf --as-needed
或者,如果您使用的是 CDBS:
include /usr/share/cdbs/1/rules/autoreconf.mk
DEB_DH_AUTORECONF_ARGS += --as-needed
【讨论】:
以上是关于如何将共享库与 --as-needed 与 automake 链接?的主要内容,如果未能解决你的问题,请参考以下文章
将共享库与 dlopen 一起使用 - 共享对象找不到加载程序导出的符号