17

如何使用 autotools/libtool 构建和安装 .so 模块,而无需将 .la 和 .a 库也安装到 --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
4

2 回答 2

4

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

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

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

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

于 2012-04-07T12:24:34.587 回答
3

我偶然发现了这个问题,因为它使用了术语“模块”,在 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 文件真的没有用。

于 2016-02-13T12:55:37.423 回答