使用Autotools和多个构建目录创建一个静态(便利?)库

时间:2011-12-07 00:39:28

标签: static-libraries autotools autoconf automake libtool

我正在维护一个库项目,该项目构建了一个“前端”库和多个“后端”库。该项目利用Autotools套件(我正在学习并发现我们项目的实施需要维护),包括Libtool。作为共享库,它们都运行良好。我们有一个应用程序开发人员使用该库,并且更喜欢使用静态库来构建,以便在多个平台上轻松分发软件(我不想讨论他的动机)。

他告诉我,在之前的一点上,他能够使用我们的构建系统构建一个大型静态库,但不再能够。我无法准确地追踪这种情况何时发生,但怀疑它可能与两个变化中的一个有关。第一个更改是删除捆绑的libtool源目录。第二个是将后端库放在/ usr / local / lib / project中,而不是像以前一样在/ usr / local / lib(默认位置)中散布它们。

我无法学习的是如何将前端库与后端组合到/ usr / local / lib下的单个便捷库中,并在Autotools框架内完成。这似乎是可能的,但我没有找到一个可以借鉴的例子。

顺便说一句,这些项目构建了多个实用程序,作为我们测试套件的一部分。我使用--disable-shared选项运行configure,然后make,并且实用程序静态链接到项目库。现在我的任务是将此功能提供给第三方应用程序。

1 个答案:

答案 0 :(得分:2)

在Libtool的术语中,便利库是未安装的库。必须使用noinst_前缀将其声明为Automake。

当您从多个便利库中构建库L时:收集所有便利库以构建将要安装的单个库L.无论L是共享库还是静态库,都会发生这种情况。

我的猜测是你有第三个改变:也许在过去你的所有后端库都是方便的(即noinst_)库,所以你只能有效安装一个.so和一个{{1最终;但在某些时候,决定自己安装所有这些后端库(即,将.a更改为noinst_或类似),因此这些库不再是便利库,它们不再包含在前端。

请注意,如果安装的后端库仍然作为前端库的pkglib_列出,则此依赖关系仍由Libtool记录。每当您链接到已安装的_LIBADD文件时(这需要您使用frontend.la进行链接,即使是作为库的用户),Libtool也应包括后端库,无论{{1}是否{} }被编译为静态或共享库。

PS:如果您的后端库实际上是由前端倾斜的Libtool模块(a.k.a.插件),问题就会略有不同。