在一个基于autotools的项目中,我正在捆绑另一个小的静态库,并以安全的方式将它链接到我的最终共享库(静态是用-fPIC等构建的)最后应该没有证据在内部静态库的存在作为构建过程的一部分,其符号应全部“复制”到共享库中。
确实满足最后一个条件,使用nm
进行检查,并在共享库上使用ldd
显示静态库上没有“必需”的ELF部分依赖性。但libtool的.la
存档文件是另一回事:那里的dependency_libs
变量选择-lmy-secret-temp-lib
(名称已被更改以保护无辜)条目,然后打破任何基于libtool的项目尝试构建最终库,因为永远不会满足依赖。非libtool项目当然没有问题,因为libtool只能在.la
个文件中查找。
有什么方法可以告诉libtool在dependency_libs
变量中包含.la
变量时,xxxx_la_LIBADD
文件中的-flibtool_ignore -lmy-secret-lib -flibtool_payattention
变量不添加库?也许有一些像.la
之类的前后args允许开发人员告诉libtool不要阻止它?很高兴能够告诉autotools / libtool根本不制作/安装{{1}}文件,但这似乎不是一个选择!
答案 0 :(得分:2)
这是我们为后人找到的最佳解决方案:
似乎没有非常简洁的方法让这个工作。我发现最好的是在“内部”链接时避免使用-L
和-l
标志,而是直接将$(builddir)/extralib/libmy-secret-lib.a
放入最终共享库的LDFLAGS / LIBADD变量中
遗憾的是,这产生了一个关于不可移植性的libtool警告以及使用-fPIC
构建“手工制作的便利库”的必要性 - 即使它已经构建了这种方式而且是完全便携。遗憾的是,...LIBTOOLFLAGS = --silent
还不足以隐藏那个哭泣的警告,但结果很好:所需的符号被复制到最终的库中,dependency_libs
未被删除,没有黑客(如下所示:{{3} }})required。