本主题说明如何提供 C/C++test 在构建测试对象/测试可执行文件时可以使用的外部符号列表(在用户或系统库中定义)——如果 C/C++test 的库符号标识 (LSI) 无法自动获取它们。对于某些嵌入式单元测试场景(例如为 Wind River 的 VxWorks 构建 DKM 测试对象),这是最可行的解决方案。如果您在 LSI 阶段遇到自动库识别或符号提取问题,这也是一个很好的解决方法。 

各节内容包括:

外部符号列表格式

外部符号列表是一个类似于 XML 的文件,它将符号列表包装在 LSI 可以理解的结构中。该文件的格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<LibrarySymbols tool="C++Test" formatVersion="1.0">
	   <Symbol name="some_symbol"/>
   <!-- ... --> 
</LibrarySymbols>

所有符号名称都必须根据为单元测试选择的编译器使用的修改方案进行修改。

获取外部符号列表

获取外部符号列表的准确过程会因操作系统、命令 shell 和可用实用程序等因素而异。获取外部符号列表的所有方法应包括:

  • 从适当的对象/库/图像转储符号名称。如果编译器输出具有通用对象格式,则可以使用操作系统的默认二进制实用程序(类似nm)来完成。更有可能的是,您将需要使用编译器提供的适当实用程序。
  • 仅从转储中过滤出定义的全局符号名称。必须过滤掉本地或未定义符号、符号地址、符号类型代码字符、源对象/库名称等。如果可用,这可以使用nmutil 自己的选项来完成。
  • 将此过滤后的符号名称列表包装在外部符号列表格式中描述的类似 XML 的结构中。

由于没有适合所有情况的单一方法,因此您需要确定适合您情况的最佳方法。为了帮助您完成此外部符号列表生成过程,C++test 提供了 LSISymLstGen Java 应用程序(源代码和编译后的二进制文件),它从类似nm的 util 输出生成 LSI 的符号列表。此输出必须是 BSD 格式('nm' 的默认格式)或通用 POSIX(可移植性)格式(-P 切换到'nm’和 'LSISymLstGen')。该应用程序位于<CPPTEST_INSTALL_DIR>/bin/engine/utils目录中。

要创建符号列表,请使用以下示例命令作为指南:

  • nm_tool -g -p --defined-only --no-demangle object_file > nm_out
  • java -cp "<CPPTEST_INSTALL_DIR>/bin/engine/utils" LSISymLstGen nm_out XML_sym_lst

此外,C/C++test 提供了“提取库符号”测试流方法(运行上述命令)以及“实用程序>提取库符号”测试配置。使用前必须编辑方法。在大多数情况下,将“外部库/对象扫描符号的路径”测试流属性设置为对象/库/图像的路径就足够了。但是,您可能还想调整“符号列表工具名称”(可能需要,因为它适用于 Wind River 的解决方案)以及“符号列表选项”。 

默认情况下,配置将尝试在 C/C++test 的缓存中为您的项目创建符号列表。这样,每次清除项目的缓存时,都必须重新创建列表。调整“带有符号的生成文件的路径”以一次为多个项目提供相同的列表可能更方便 - 或者只是在缓存删除时不清除它。

如果您需要调整 JRE 可执行文件的路径,您可以修改测试流方法中的"jre"属性。

要了解如何编辑/调整测试流方法,请参阅 自定义测试执行流

自定义测试流方法以加载外部符号列表

要将 C/C++test 配置为在构建测试对象/可执行文件时使用符号列表,您需要修改适当的方法(从您使用的测试配置调用的方法)。唯一需要修改的是向 LsiStep 标记添加 libSymFile 属性。示例:<LsiStep libSymFile="XML_sym_lst" />

Wind River DKM 中包含的许多测试流方法(与补充测试配置相结合)都使用外部符号列表作为 VxWorks 图像符号源。专门为使用外部符号列表的自动存根生成提供了一种测试配置:“实用程序> 使用外部库符号生成桩函数。” 

默认情况下,这些测试配置将在 C++test 项目的缓存中搜索外部符号列表。要更改此设置,您可以调整其“带有外部符号列表的文件路径”测试流属性。 

  • No labels