使用libtool进行静态链接,而不修改.la文件中的dependency_libs。

5
在一个基于autotools的项目中,我正在捆绑另一个小型静态库,并以安全的方式将其链接到我的最终共享库中(静态库已使用-fPIC等参数构建)。最终,在构建过程中不应该有任何关于内部静态库存在的证据,并且它的所有符号都应该被"复制"到共享库中。
最后一个条件肯定满足,可以使用 nm 进行检查,并且在共享库上使用 ldd 时,在静态库上没有需要"needed" ELF段依赖。但是libtool的 .la 归档文件是一个不同的故事:其中的 dependency_libs 变量会捕捉到一个-lmy-secret-temp-lib (为了保护无辜者更改了名称)条目,这将破坏任何试图针对最终库构建的基于libtool的项目,因为该依赖关系永远无法得到满足。当然,非libtool项目很好,因为除了libtool之外,没有什么东西会查看 .la 文件。
有没有办法告诉libtool在包含在 xxxx_la_LIBADD 变量中时不要将库添加到 dependency_libs 变量中的 .la 文件中?也许有一些类似于-flibtool_ignore -lmy-secret-lib -flibtool_payattention 的前后参数,允许开发人员告诉libtool停止阻碍?能够告诉autotools / libtool不制作/安装 .la 文件将是很好的,但这似乎不是一个选项!

你可能想要了解一下libtool convenience libraries,因为它听起来与你目前正在做的事情非常相似。 - ldav1s
@ldav1s 感谢您的建议,但我已经知道方便库的存在 - 实际上,我想做的是将非libtool静态库用作方便库,但找不到方法来实现这一点... - andybuckley
1个回答

3
这是我们为后人找到的最佳解决方案:
似乎没有很好的方法使其正常工作。我找到的最好的方法是在内部链接时避免使用 -L-l 标志,而是直接将 $(builddir)/extralib/libmy-secret-lib.a 放入最终共享库的 LDFLAGS/LIBADD 变量中。
不幸的是,这会产生一个关于不可移植性和需要使用 -fPIC 构建“手工制作的方便 lib”的 libtool 警告,即使它已经以这种方式构建并且完全可移植。...LIBTOOLFLAGS = --silent 不足以隐藏这个 cry-wolf 警告,但结果是好的:所需的符号被复制到最终库中,dependency_libs 保持不变,无需任何 hack(如此处:https://gitorious.org/libguestfs/libguestfs/source/c46bedf925cd9c6c9a9cbaee115358fd1dffcbfe:libtool-kill-dependency_libs.sh)即可实现。

而且还有一个进一步的跟进:这种方式也被证明是尴尬的,最后实际上最容易的方法是将外部库的构建系统转换为libtool,并将其视为我的库的一个组成部分(通过一些命名空间修改来避免符号冲突,以防我的库被用户链接到同一个外部库)。可惜的是,libtool似乎无法与其他地方创建的静态库很好地配合使用。 - andybuckley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接