【问题标题】:Create a single static (convenience?) library with Autotools and multiple build directories使用 Autotools 和多个构建目录创建单个静态(方便?)库
【发布时间】:2011-12-07 00:39:28
【问题描述】:

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

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

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

顺便说一句,这些项目构建了几个实用程序作为我们测试套件的一部分。我使用 --disable-shared 选项运行配置,然后运行,实用程序静态链接到项目库。现在我的任务是让第三方应用程序可以使用此功能。

【问题讨论】:

  • 您是否运行了相当于 git bisect 的版本控制来确定是哪个提交负责?
  • 没有。我不确定他使用的命令以及他当时是否使用了自己的脚本。另外,我自己从来没有以这种方式构建库,因为我不关心静态库。大约一年前,我第一次了解到这一点,并且断断续续地寻找答案或至少一些线索。
  • 将 /usr/local/lib 中的安装目录统一描述为“分散”而不是将 /usr/local/lib/[project]/ 中的安装位置分散描述为似乎很奇怪这样的。
  • @WilliamPursell 在当时描述它可能是一种奇怪的方式。目前这并不重要,因为该项目已转变为拥有一个解决此问题的大型库和其他几个作为奖励。

标签: static-libraries autotools autoconf automake libtool


【解决方案1】:

在 Libtool 的行话中,便利库是未安装的库。它必须以 noinst_ 前缀声明为 Automake。

当您从多个便利库中构建一个库 L 时:所有便利库都聚集在一起构建一个将被安装的库 L。无论 L 是共享库还是静态库,都会发生这种情况。

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

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

PS:如果您的后端库实际上是由前端 dlopened 的 Libtool 模块(也称为插件),则问题会略有不同。

【讨论】:

  • 感谢您的信息。我相信,随着我了解得更多,这对我来说会更有意义。在研究 configure.ac 和各种 Makefile.am 文件时,我会留意这些关键字。
  • 顺便说一句,对于任何愿意查看的人,Git 存储库位于hamlib.git.sourceforge.net/git/gitweb.cgi?p=hamlib/…,这是一个用于将各种无线电控制协议转换为统一 API 的 LGPL/GPL 库。一点点 grepping 显示所有后端库都指定为 pkglib_LTLIBRARIES = hamlib-backend.la/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多