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

Ale*_*min 16 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
Run Code Online (Sandbox Code Playgroud)

它有效,但除了libCurlDownloader.so之外,它还安装了libCurlDownloader.la和libCurlDownloader.a,这是不可取的.

更新#1

通过使用任何一个都可以使.a无法生成

./configure --disable-static
Run Code Online (Sandbox Code Playgroud)

要么

AC_ENABLE_SHARED(yes)
AC_ENABLE_STATIC(no)
Run Code Online (Sandbox Code Playgroud)

在configure.ac中

但是仍然存在如下问题:如何在安装.so时将.la安装到安装--prefix中.

更新#2

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

install-exec-hook: find $(DESTDIR)$(libdir) -type f -name \*.la -delete
Run Code Online (Sandbox Code Playgroud)

apm*_*ell 4

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

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

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

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

  • 类似地 - 即使对于动态链接 `pkg-config` 也提供了比 libtool 拐杖更好的帮助;以独立于构建系统的方式。 (5认同)
  • 对于静态链接依赖;几乎总是有(甚至比现有的 .la 文件更常见)“pkg-config”指令可用。 (3认同)