如何将共享库与 --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 一起使用 - 共享对象找不到加载程序导出的符号

将第三方共享库与 Python ctypes 集成

如何将产品媒体库与收藏一起加载?

无法将共享库与 -mx32 和 gcc 4.7 或 gcc 4.8 链接

(转)HelloWorld CMake CMake中构建静态库与动态库及其使用