2014-01-28 56 views
4

在基于自动工具的项目中,我捆绑了另一个小型静态库,并以安全的方式将它链接到我的最终共享库中(静态是使用-fPIC等等)。最终应该没有任何内部静态库存在的证据作为构建过程的一部分,它的符号应该被“复制”到共享库中。静态链接libtool,不修改.la文件中的dependency_libs

最后一个条件肯定满足,使用nm进行检查,并且在共享库上使用ldd时,在静态库中没有显示“需要”的ELF段依赖关系。但libtool的.la档案文件是不同的故事:在那里的dependency_libs变量拿起一个-lmy-secret-temp-lib(名称已被改变,以保护无辜)入口,然后打破任何基于libtool的项目,试图对最终的库建立,因为依赖关系可以永远不会被满足。非libtool项目当然没问题,因为除了libtool以外,其他文件都不在.la中。

有没有一种方法可以告诉libtool在变量中包含变量时不向.la文件中的dependency_libs变量添加库?也许有一些像-flibtool_ignore -lmy-secret-lib -flibtool_payattention之类的前后参数可以让开发人员告诉libtool停止阻碍吗?能够告诉autotools/libtool根本不制作/安装.la文件会很好,但这似乎不是一种选择!

+0

您可能想查看[libtool便利库](http://www.gnu.org/software/automake/manual/html_node/Libtool-Convenience-Libraries.html),因为它听起来与您所看到的非常相似正在做。 – ldav1s

+0

@ ldav1s感谢您的建议,但我已经知道便利库 - 基本上我想要做的是使用非libtool静态库作为便利库,但无法找到一种方法来做到这一点... – andybuckley

回答

1

下面是我们已经找到了最佳的解决方案,为后人:

似乎没有很巧妙的方法来得到这个工作。我发现最好的方法是避免-L-l这样的“内部”链接,而是直接将$(builddir)/extralib/libmy-secret-lib.a放入最终共享库的LDFLAGS/LIBADD变量中。

这不幸产生libtool的警告有关非便携性和与-fPIC打造的“手工制作方便LIB”的需求 - 即使它已建成这样,是完全可移植的。 ...LIBTOOLFLAGS = --silent还不足以隐藏那只狼来的警告,不幸的是,结果很好:需要的符号被复制到最终的库中,dependency_libs没有被消灭,并且没有需要的黑客(如:https://gitorious.org/libguestfs/libguestfs/source/c46bedf925cd9c6c9a9cbaee115358fd1dffcbfe:libtool-kill-dependency_libs.sh)。

+0

还有一个后续的问题:这种方式也被证明很尴尬,最后实际上最容易的做法是将外部库的构建系统转换为libtool,并将其视为库的一个组成部分(为了避免符号冲突, lib永远不会被用户链接到相同的外部库)。遗憾的是,libtool似乎不能很好地与其他地方创建的静态库一起玩。 – andybuckley