C++ 如何使用自动工具将测试单元添加到共享库项目

C++ 如何使用自动工具将测试单元添加到共享库项目,c++,shared-libraries,autotools,C++,Shared Libraries,Autotools,我正在开发一个可以进行大量计算的库。它使用GNU自动工具构建系统。有一个测试项目链接到此库并运行各种测试过程。每个程序都将结果与MATLAB中预先计算的值进行比较 我发现测试过程既无聊又耗时。每次我需要做make,sudomake在库中安装,在测试项目中生成,然后运行程序,看看发生了什么 使用自动工具向库中添加检查目标的标准方法是什么?它应满足以下要求: 用户应该能够进行检查并查看结果,而无需安装库本身。可执行文件应该链接到最近编译的、尚未安装的共享对象。 运行make check也应运行测试程

我正在开发一个可以进行大量计算的库。它使用GNU自动工具构建系统。有一个测试项目链接到此库并运行各种测试过程。每个程序都将结果与MATLAB中预先计算的值进行比较

我发现测试过程既无聊又耗时。每次我需要做make,sudomake在库中安装,在测试项目中生成,然后运行程序,看看发生了什么

使用自动工具向库中添加检查目标的标准方法是什么?它应满足以下要求:

用户应该能够进行检查并查看结果,而无需安装库本身。可执行文件应该链接到最近编译的、尚未安装的共享对象。 运行make check也应运行测试程序。不仅要编译它。检查结果取决于测试单元程序的返回值。如果测试单元失败,则make应显示错误。 若用户决定不进行检查,则不应编译任何可执行文件。
因为您已经在使用自动工具,所以您已经拥有了大部分基础设施。我不知道目录布局,但假设您在顶级Makefile.am中有:SUBDIRS=soroush tests,或者,您可能在soroush目录中有SUBDIRS=tests。重要的是,libtool管理的libsoroush.la在下降到tests目录之前存在

前缀check_uu表示这些对象(在本例中为程序)在运行make check之前不应构建。所以在tests/Makefile.am=>check_PROGRAMS=t1 t2 t3中

对于每个测试程序,您可以指定:t1\u SOURCES=t1.cc等。作为一种快捷方式,如果每个测试只有一个源文件,则可以使用AM\u DEFAULT\u source\u EXT=.cc,这将隐式地为您生成源。到目前为止:

AM_CPPFLAGS = -I$(srcdir)/.. $(OTHER_CPPFLAGS) # relative path to lib headers.

LDADD = ../soroush/libsoroush.la

check_PROGRAMS = t1 t2 t3
AM_DEFAULT_SOURCE_EXT = .cc

# or: t1_SOURCES = t1.cc, t1_LDADD = ../soroush/libsoroush.la, etc.
make check将生成但不执行这些程序。为此,您需要添加:

TESTS = $(check_PROGRAMS)
这种方法真正的好处在于,如果libsoroush构建为共享库,那么libtool将使用卸载的库处理库搜索路径等

通常,生成的t1程序只是一个shell脚本,用于设置环境变量,以便可以执行真正的二进制文件:.libs/t1。我只提到这一点,因为使用libtool的全部意义在于您不必担心它是如何完成的


测试反馈更为复杂,这取决于您的需求。您可以使用并行测试线束,也可以使用简单的通过/失败反馈。除非测试是一个主要瓶颈,或者项目规模巨大,否则只需使用或编写脚本测试就更容易了。

因为您已经在使用autotools,所以您已经拥有了大部分基础设施。我不知道目录布局,但假设您在顶级Makefile.am中有:SUBDIRS=soroush tests,或者,您可能在soroush目录中有SUBDIRS=tests。重要的是,libtool管理的libsoroush.la在下降到tests目录之前存在

前缀check_uu表示这些对象(在本例中为程序)在运行make check之前不应构建。所以在tests/Makefile.am=>check_PROGRAMS=t1 t2 t3中

对于每个测试程序,您可以指定:t1\u SOURCES=t1.cc等。作为一种快捷方式,如果每个测试只有一个源文件,则可以使用AM\u DEFAULT\u source\u EXT=.cc,这将隐式地为您生成源。到目前为止:

AM_CPPFLAGS = -I$(srcdir)/.. $(OTHER_CPPFLAGS) # relative path to lib headers.

LDADD = ../soroush/libsoroush.la

check_PROGRAMS = t1 t2 t3
AM_DEFAULT_SOURCE_EXT = .cc

# or: t1_SOURCES = t1.cc, t1_LDADD = ../soroush/libsoroush.la, etc.
make check将生成但不执行这些程序。为此,您需要添加:

TESTS = $(check_PROGRAMS)
这种方法真正的好处在于,如果libsoroush构建为共享库,那么libtool将使用卸载的库处理库搜索路径等

通常,生成的t1程序只是一个shell脚本,用于设置环境变量,以便可以执行真正的二进制文件:.libs/t1。我只提到这一点,因为使用libtool的全部意义在于您不必担心它是如何完成的


测试反馈更为复杂,这取决于您的需求。您可以使用并行测试线束,也可以使用简单的通过/失败反馈。除非测试是一个主要的瓶颈,或者项目规模巨大,否则只需使用或编写脚本测试就更容易了。

我在src subdir旁边的测试中添加了一个手工编写的测试套件程序。现在很好用。只需阅读并联/串联线束。就我而言,不可能使事情同时发生。因为我正在测试一个链式推理机,其中每个输出都是另一个推理系统的输入。剩下的唯一一件事就是将返回代码更改为77、99和0。@soroush-虽然我经常使用并行make-j,但我的项目还不足以证明“完整”并行测试的复杂性。一个关于如何禁用并行测试的问题正是因为您提到的原因!从main返回0仍然是通过,1是软失败-也许您可以将测试设置为运行的shell脚本
测试按顺序进行,并以您喜欢的方式处理返回值。现在很好用。只需阅读并联/串联线束。就我而言,不可能使事情同时发生。因为我正在测试一个链式推理机,其中每个输出都是另一个推理系统的输入。剩下的唯一一件事就是将返回代码更改为77、99和0。@soroush-虽然我经常使用并行make-j,但我的项目还不足以证明“完整”并行测试的复杂性。一个关于如何禁用并行测试的问题正是因为您提到的原因!从main返回0仍然是通过,1是软失败-也许您可以将测试设置为按顺序运行测试的shell脚本,并以您喜欢的方式处理返回值。