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

17

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

目前我正在使用以下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文件中。

但问题仍然是如何使.la文件不被安装到 --prefix 目录,同时让.so文件被安装。

更新 #2

可以使用以下方法从安装的 --prefix 目录中删除.la文件:

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

你有一个小的拼写错误(应该是install-exec-hook)。 - Compholio
我认为你做不到,Debian 打包者正在手动删除 deb 包中的 la 文件。 - sherpya
“install-exec-hook” 似乎不是一个好主意。它会从目录中删除所有 .la 文件,而不仅仅是由您的项目生成的文件。如果使用了“DESTDIR”,那么这并不是什么大问题,但否则就非常错误了。 - Maarten
2个回答

4
您不一定需要删除.la文件。 .la文件包含在两种情况下使用的信息:
  1. 静态链接已构建库时。当静态链接(即.a-static)时,没有有关链接库的依赖关系的信息,因此libtool可以使用.la文件中的信息创建适当的ld命令引用所有必要的依赖项。这在像MinGW这样的环境中更为重要,其中链接器需要以特定顺序指定相同的库以解决递归依赖项。只有在打算构建静态二进制文件时才需要考虑此问题。

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

Debian / Ubuntu打包人员决定从其软件包中排除.la文件,因为第二个原因在Linux上不适用,并且他们希望您首先不要构建静态二进制文件。在其他libtool设计支持的平台上,可能需要.la文件来链接或运行程序。


3
对于静态链接依赖项,几乎总是可以使用 pkg-config 指令(甚至比现有的 .la 文件更常见)。 - Alexander Tumin
5
类似地,即使是针对动态链接,pkg-config 提供了比 libtool 更好的帮助,而且以构建系统独立的方式实现。 - Alexander Tumin

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文件真的没有用。


你找到了吗?我真的很讨厌这个。 - Iharob Al Asimi
@iharob 不是,仍在使用那个钩子规则来清理 .la 文件。如果您想查看更多细节,请访问此处的项目。 - troglobit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接