本主题说明了如何提供外部符号列表(在用户库或系统库中定义),如果 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 和可用的实用工具等因素而有所不同。获取外部符号列表的所有方法应包括:

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

由于没有一种方法适用于所有上下文,因此您需要确定适合您的情况的最佳方法。为了帮助您处理这个外部符号列表生成过程,C++test 提供了 LSISymLstGen Java 应用程序(包括源代码和已编译的二进制文件),该应用程序从类似于 nm的 util 输出为 LSI 生成符号列表。此输出必须为 BSD 格式(默认为 'nm')或通用 POSIX(可移植性)格式(-P 转换为 'nm’ 和 'LSISymLstGen')。该应用程序位于 C++test_install_dir/engine/utils 目录。

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

  • nm_tool -g -p --defined-only --no-demangle object_file > nm_out
  • java -cp "C++test_install_dir/engine/utils " LSISymLstGen nm_out XML_sym_lst

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

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

如果需要调整 JRE 可执行文件的路径,则可以修改【测试流程】配方中的“jre”属性。

要学会如何编辑/调整测试流配方,请查阅 自定义测试执行流

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

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

Wind River 的 DKM 中包含的许多测试流配方(加上补充的测试配置)都使用外部符号列表作为 VxWorks 图像符号源。特别为使用外部符号列表自动生成存根提供了一个测试配置:“实用程序> 使用外部库符号生成存根"。 

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

  • No labels