使用autotools / libtool构建.so模块,不安装.la和.a变体

时间:2011-08-18 08:29:21

标签: module autotools libtool

如何使用不带.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。

更新#2

可以使用

从安装--prefix中删除.la文件
install-exec-hook: find $(DESTDIR)$(libdir) -type f -name \*.la -delete

2 个答案:

答案 0 :(得分: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))

要清楚,在我的用例中,没有人会对我的插件“链接”。所以,所以.la文件真的没用。

答案 1 :(得分:2)

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

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

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

  3. Debian / Ubuntu打包商决定从他们的软件包中排除.la个文件,因为第二个原因不适合Linux,他们希望你没有首先构建静态二进制文件。在libtool旨在支持的其他平台上,链接或运行程序可能需要.la个文件。