允许与Throw The Switch中的Unity单元测试框架进行双浮点比较

9vw9lbht  于 2023-11-16  发布在  其他
关注(0)|答案(3)|浏览(134)

我在尝试编译一个使用Unity测试框架由Throw The Switch编写的测试时,在链接器的某个地方遇到了一些问题。我有其他测试可以编译和运行得很好,所以我肯定只是在启用Assert助手进行双浮点比较时遗漏了一些东西。
头文件中有文档告诉我们如何启用双浮点比较。

*     - define UNITY_INCLUDE_DOUBLE to allow double floating point comparisons

字符串
但是,我最终犯了这个错误:

Undefined symbols for architecture x86_64:
  "_UnityAssertDoublesWithin", referenced from:
      _test_example in main-6fae82.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)


我写了一个最简单的例子来复制它:

#define UNITY_INCLUDE_DOUBLE

#include "unity.h"

void test_example(void)
{
    TEST_ASSERT_EQUAL_DOUBLE(1.234, 1.234);
}

int main(void) {
    UNITY_BEGIN();
    RUN_TEST(test_example);
    return UNITY_END();
}


示例的CWD的内容和用于调用clang的确切命令(再次显示相同的错误):

$ ls
main.c          unity.c         unity.h         unity_internals.h
$ clang unity.c main.c
Undefined symbols for architecture x86_64:
  "_UnityAssertDoublesWithin", referenced from:
      _test_example in main-ee77c2.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)


同样的事情发生在gcc上(但它实际上只是在引擎盖下调用clang)。
我很确定我只是少了一小步,但我的生活,我不能看到它是什么,现在。提前感谢您的帮助。

798qvoo8

798qvoo81#

我在我的最小测试中使用了unity_log.h文件中的相同定义,并添加了UNITY_INCLUDE_CONFIG_H作为编译器-D标志(gcc)。
你可以在ThrowTheSwitch GitHub repo上找到一个unity_config.h文件的完整副本。我通常只是把它扔到Unity所在的同一个文件夹中。
如果您按照unity. h文件中的注解(您在问题中引用的注解)中指定的方式将定义直接添加到该文件中,也可以工作,该文件表示:
下面描述的所有选项都应该作为编译器标志传递给所有使用Unity的文件。如果你必须添加#defines,请将它们放在上面的#include之前。
unity.h

#define UNITY_INCLUDE_DOUBLE
#include "unity_internals.h"
...

字符串
为什么你最初的策略,本质上应该是一样的,不起作用,我不知道。

e7arh2l6

e7arh2l62#

看起来这在使用-D标志将UNITY_INCLUDE_DOUBLE定义为clang/gcc时有效。例如:

$ clang -DUNITY_INCLUDE_DOUBLE -DUNITY_DOUBLE_PRECISION=1e-12f unity.c main.c
$ ./a.out 
main.c:10:test_example:PASS

-----------------------
1 Tests 0 Failures 0 Ignored 
OK

字符串

pqwbnv8z

pqwbnv8z3#

启用此功能(以及添加任何其他UNITY配置)的最简单方法是在project.yml中定义它。这也是一种更好的方法,因为它允许我们在项目级别上控制UNITY配置。

:defines:
  :common: &common_defines []
  :test:
    - *common_defines
    - TEST
    - UNITY_INCLUDE_DOUBLE # Add it here without D prefix

字符串
支持Ceedling 0.31.1 / Unity 2.5.4

相关问题