首页 > 解决方案 > 测试二进制文件创建了临时包装器

问题描述

在使用 autotools 构建和测试的项目中,我遇到以下行为:

位于.libs文件夹中的测试二进制文件被创建为临时包装脚本。他们的标题包含一些信息

# cregions1 - temporary wrapper script for .libs/cregions1
# Generated by libtool (GNU libtool) 2.4.2
#
# The cregions1 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.

一些(但不是全部)获得lt-他们名字前面的前缀。因此,这些测试失败,因为没有找到合适的参考输出。

上述错误消息表明构建测试时可能缺少动态库。但是,我还不能弄清楚这些到底是什么以及如何轻松地包含它们。有谁知道如何解决这个问题?

标签: autotoolslibtool

解决方案


在使用 autotools 构建和测试的项目中,我遇到以下行为:

位于 .libs 文件夹中的测试二进制文件被创建为临时包装脚本。他们的标题包含一些信息

# cregions1 - temporary wrapper script for .libs/cregions1
# Generated by libtool (GNU libtool) 2.4.2
#
# The cregions1 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.

一些(但不是全部)在他们的名字前获得前缀 lt-。

如果这确实是您所看到的,那么您的项目或您的 Autotools 中的某些东西已经严重损坏。但正如我在评论中暗示的那样,我怀疑您所看到的实际上与您的描述有些不同。

具体来说,在使用 Libtool 的 Automake 项目中,您应该看到每个编译的程序目标(通过foo_PROGRAMS变量指定)都构建为您描述的包装脚本。也就是说,目标本身是作为脚本构建的。此外,在相应的.libs文件夹中构建了两个二进制文件,一个带有lt-前缀,另一个没有。同样,.libs包含真正的二进制文件,而不是脚本,每个程序目标两个。*

因此,这些测试失败,因为没有找到合适的参考输出。

您不应该尝试直接在 .libs 中运行二进制文件。相反,您应该运行相应的包装器。毕竟,它们是您指定的应该构建的东西。** 它们用于启动真正的二进制文件,从而满足库依赖关系,尤其是对同一项目中包含的已卸载共享库的依赖关系。

您可能会认识到这大致类似于 Automake + Libtool 构建共享库的方式:在 Makefile.am 中指定的工件是一个“libtool 存档”,扩展名为.la. 这是一个元数据文件,它引用了内置的其他工件.libs/

上述错误消息表明构建测试时可能缺少动态库。

这不是错误消息。这是一个解释(部分)包装脚本原因的评论。

但是,我还不能弄清楚这些到底是什么以及如何轻松地包含它们。有谁知道如何解决这个问题?

如果实际上您的构建正在产生预期的工件,根据我描述的模式,那么您似乎正在竭尽全力让自己变得困难。您应该能够通过包装脚本运行构建的二进制文件。这正是他们的目的。这个想法是,它们透明地隐藏了运行已卸载二进制文件(可能包括 RPATH 和其他有趣的东西)的复杂性,包括那些依赖于属于同一项目的已卸载共享库的那些(在许多情况下,默认情况下不会被动态链接器)。

如果您的构建没有产生预期的工件和模式,那么您可能正在做一些干扰,例如玩带有符号链接的游戏或提供与.libs/(可能是无意的)内容混杂的自定义规则。


*在某些情况下,可能会为每个目标构建更少的二进制文件,但在所有情况下,您都应该看到.libs/它只包含真正的二进制文件,而不是包装脚本。

**我的意思是包装脚本是使用您为所需目标指定的名称和位置构建的。大概您没有想到当您安装这些脚本时会在系统上安装这些脚本make install,而且您确实不明白。 make install将安装真正的二进制文件。


推荐阅读