Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 构建带有autotools/libtool且未安装.la和.a变体的.so模块_Module_Autotools_Libtool - Fatal编程技术网

Module 构建带有autotools/libtool且未安装.la和.a变体的.so模块

Module 构建带有autotools/libtool且未安装.la和.a变体的.so模块,module,autotools,libtool,Module,Autotools,Libtool,如何在没有.la和.a库的情况下使用autotools/libtool构建和安装.so模块 是否也安装到--prefix path中 目前我正在使用以下Makefile.am: lib_LTLIBRARIES = libCurlDownloader.la libCurlDownloader_la_SOURCES = Curl.cpp libCurlDownloader_la_LDFLAGS = -module -avoid-version 它可以工作,但除了libCurlDownloader.

如何在没有.la和.a库的情况下使用autotools/libtool构建和安装.so模块 是否也安装到--prefix path中

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

在configure.ac中

但问题仍然是如何使.la不被安装到安装中——在安装.so时使用前缀

更新#2

可以从安装中删除.la文件--使用前缀

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

您不必删除
.la
文件。
.la
文件包含两种情况下使用的信息:

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

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


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

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

    您有一个小的输入错误(应该是install exec hook)。我认为您不能,debian打包程序正在手动删除deb Packages中的la文件,这似乎是个坏主意。它将从目录中删除所有.la文件,而不仅仅是项目生成的文件。如果使用
    DESTDIR
    ,问题不大,但在其他方面则非常错误;几乎总是有(比现有的.la文件更常见)可用的
    pkg-config
    指令。类似地,即使是动态链接
    pkg-config
    也比libtool拐杖提供更好的帮助;以独立于构建系统的方式。您找到了吗?我真的很讨厌这个。@iharob没有,仍然使用钩子规则来清理.la文件。如果您想查看更多详细信息,则该项目正在进行中。
    AM_LDFLAGS = -module -avoid-version -shared
    pkglib_LTLIBRARIES = alsa-utils.la bootmisc.la
    
    install-exec-hook:
            @(cd $(DESTDIR)$(pkglibdir) && $(RM) $(pkglib_LTLIBRARIES))