我在尝试编译一个使用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)。
我很确定我只是少了一小步,但我的生活,我不能看到它是什么,现在。提前感谢您的帮助。
3条答案
按热度按时间798qvoo81#
我在我的最小测试中使用了unity_log.h文件中的相同定义,并添加了
UNITY_INCLUDE_CONFIG_H
作为编译器-D
标志(gcc)。你可以在ThrowTheSwitch GitHub repo上找到一个
unity_config.h
文件的完整副本。我通常只是把它扔到Unity所在的同一个文件夹中。如果您按照unity. h文件中的注解(您在问题中引用的注解)中指定的方式将定义直接添加到该文件中,也可以工作,该文件表示:
下面描述的所有选项都应该作为编译器标志传递给所有使用Unity的文件。如果你必须添加#defines,请将它们放在上面的#include之前。
即
unity.h
字符串
为什么你最初的策略,本质上应该是一样的,不起作用,我不知道。
e7arh2l62#
看起来这在使用-D标志将UNITY_INCLUDE_DOUBLE定义为clang/gcc时有效。例如:
字符串
pqwbnv8z3#
启用此功能(以及添加任何其他UNITY配置)的最简单方法是在
project.yml
中定义它。这也是一种更好的方法,因为它允许我们在项目级别上控制UNITY配置。字符串
支持Ceedling 0.31.1 / Unity 2.5.4