如何使用不带.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
答案 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
文件包含在两种情况下使用的信息:
静态链接到构建的库。静态链接(即.a
和-static
)时,没有关于链接库的依赖关系的信息,因此libtool可以使用.la
文件中的信息来创建合适的ld
命令引用所有必需的依赖项。这在像MinGW这样的环境中通常更为重要,其中链接器需要以特定顺序指定相同的库,以解析递归依赖性。如果打算构建静态二进制文件,这只是一个问题。
在某些平台上动态加载构建库(例如,如果使用lt_dlopen
,则使用libltdl
)。类似地,在某些平台上,编译模块的依赖关系不会在二进制文件中编码,因此需要.la
文件,以便lt_dlopen
找到并加载正确的依赖关系。在ELF平台(包括Linux)和PE平台(即Windows)上,依赖关系存储在库中,因此lt_dlopen
将在没有.la
文件的情况下工作。构建软件包时,MacOS上的MachO格式可能需要.la
个文件。
Debian / Ubuntu打包商决定从他们的软件包中排除.la
个文件,因为第二个原因不适合Linux,他们希望你没有首先构建静态二进制文件。在libtool旨在支持的其他平台上,链接或运行程序可能需要.la
个文件。