【问题标题】:Building .so module with autotools/libtool without .la and .a variants being installed在不安装 .la 和 .a 变体的情况下使用 autotools/libtool 构建 .so 模块
【发布时间】:2011-10-29 14:08:47
【问题描述】:

如何在没有 .la 和 .a 库的情况下使用 autotools/libtool 构建和安装 .so 模块 是否也安装到 --prefix 路径中?

目前我正在使用以下 Makefile.am:

lib_LTLIBRARIES = libCurlDownloader.la
libCurlDownloader_la_SOURCES = Curl.cpp
libCurlDownloader_la_LDFLAGS = -module -avoid-version

它可以工作,但是除了libCurlDownloader.so之外它还安装了libCurlDownloader.la和libCurlDownloader.a,这是不可取的。

更新 #1

有可能使 .a 不生成,通过使用任何一个

./configure --disable-static

AC_ENABLE_SHARED(yes)
AC_ENABLE_STATIC(no)

在configure.ac中

但在安装 .so 时如何使 .la 不被安装到安装 --prefix 仍然是个问题。

更新 #2

可以从安装中删除 .la 文件 --prefix 使用

install-exec-hook: find $(DESTDIR)$(libdir) -type f -name \*.la -delete

【问题讨论】:

  • 你有一个小错误(应该是 install-exec-hook)。
  • 我认为你不能,debian 打包程序正在手动删除 deb 包中的 la 文件
  • install-exec-hook 似乎是个坏主意。它会从目录中删除所有 .la 文件,而不仅仅是项目生成的文件。如果使用DESTDIR,则问题不大,否则就大错特错了。

标签: module autotools libtool


【解决方案1】:

您不一定要删除 .la 文件。 .la 文件包含在两种情况下使用的信息:

  1. 静态链接到已构建的库。当静态链接时(即.a-static),没有关于被链接库的依赖关系的信息,因此libtool 可以使用.la 文件中的信息来创建一个适当的ld 命令引用所有必要的依赖关系。这在像 MinGW 这样的环境中通常更重要,在这种环境中,链接器需要以特定顺序指定多个相同的库来解决递归依赖关系。如果您打算构建静态二进制文件,这只是一个问题。

  2. 一些平台上动态加载构建库(即,如果使用libltdl,则使用lt_dlopen)。类似地,在某些平台上,编译模块的依赖关系没有以二进制编码,因此需要.la 文件以便lt_dlopen 找到并加载正确的依赖关系。在 ELF 平台(包括 Linux)和 PE 平台(即 Windows)上,依赖项存储在库中,因此 lt_dlopen 将在没有 .la 文件的情况下工作。 MacOS 上的 MachO 格式在构建捆绑包时可能需要 .la 文件。

Debian/Ubuntu 打包者决定从他们的包中排除 .la 文件,因为第二个原因在 Linux 上不合适,他们更希望您一开始就不要构建静态二进制文件。在 libtool 旨在支持的其他平台上,可能需要 .la 文件来链接或运行程序。

【讨论】:

  • 用于静态链接依赖;几乎总是有(甚至比现有的 .la 文件更频繁)pkg-config 指令可用。
  • 类似——即使对于动态链接pkg-config 提供了比 libtool 拐杖更好的帮助;以独立于构建系统的方式。
【解决方案2】:

我偶然发现了这个问题,因为它使用了术语“模块”,在 automake/libtool 中,它是插件的术语。我在 Finit 中有一个插件系统,因此我使用“-module”构建插件以避免创建 .a 文件。但是我仍然安装了 .la 文件,这实际上甚至不适用于“-module”情况。

我还没有找到一个文档化的方法来跳过插件的 .la 文件,但我是这样做的:

AM_LDFLAGS = -module -avoid-version -shared
pkglib_LTLIBRARIES = alsa-utils.la bootmisc.la

install-exec-hook:
        @(cd $(DESTDIR)$(pkglibdir) && $(RM) $(pkglib_LTLIBRARIES))

需要明确的是,在我的用例中,没有人会“链接”我的插件 .so 的,所以 .la 文件真的没有用。

【讨论】:

  • 找到了吗?我真的很讨厌这个。
  • @iharob nope,仍然使用该挂钩规则来清理 .la 文件。如果您想查看更多详细信息,该项目是here
猜你喜欢
  • 2014-09-23
  • 2012-03-19
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2010-12-15
  • 2011-08-12
相关资源
最近更新 更多