我如何使用;统一",;在Mac(Lion)上单元测试C代码?

我如何使用;统一",;在Mac(Lion)上单元测试C代码?,c,gcc,osx-lion,unity-test-framework,C,Gcc,Osx Lion,Unity Test Framework,首先让我说我不是一个C开发人员,我对实际编写C代码知之甚少。我一直在做一些研究,以找到一个xUnit框架,我可以用它来为C代码编写测试,根据我发现的,它似乎是我想要使用的。这看起来很简单,但我真的不知道从Unity的网站下载zip文件后该怎么办。它似乎没有正常的configure/make/make安装,如果有,我不确定这是我应该使用的。不过,它确实附带了一些rake任务,但这些任务似乎都不是任何类型的“安装”任务。作为最后的手段,我试图用我的代码复制3个源文件(我真的希望这不是正确的做法),但

首先让我说我不是一个C开发人员,我对实际编写C代码知之甚少。我一直在做一些研究,以找到一个xUnit框架,我可以用它来为C代码编写测试,根据我发现的,它似乎是我想要使用的。这看起来很简单,但我真的不知道从Unity的网站下载zip文件后该怎么办。它似乎没有正常的configure/make/make安装,如果有,我不确定这是我应该使用的。不过,它确实附带了一些rake任务,但这些任务似乎都不是任何类型的“安装”任务。作为最后的手段,我试图用我的代码复制3个源文件(我真的希望这不是正确的做法),但是当我尝试用gcc编译我的c文件时,我遇到了一个错误,但我认为这应该是可行的。以下是我的设置:

src/
  mycode.c
  unity.c
  unity.h
  unity_internals.h
这是mycode.c的源代码

/* mycode.c */
#include "unity.h"

void test_sample(void)
{
    TEST_ASSERT_EQUAL_INT(0, 0);
}
当我运行
gcc mycode.c
时,我得到:

Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
  "_UnityAssertEqualNumber", referenced from:
      _test_sample in ccyHByv6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
(当我试图用gcc编译unity.c时,我遇到了一个类似的错误)。我认为这意味着unity附带的代码需要一个不同于我的编译器,即:

i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00)
或者unity可能与64位处理器不兼容。。。(我在Mac OS 10.7.3上运行的是一个2.4 GHz的Intel Core 2 Duo处理器——另一件可能相关也可能不相关的事情是我已经有了XCode版本4.3(4E109)和XCode的命令行工具)在这一点上,我只是抓住了救命稻草,我有点不知所措


我的问题是,获取第三方C库(如Unity)并使其可用于我的C代码的正确过程是什么?我是否需要在Python或Ruby中安装一些东西,或者像Java或其他东西一样在路径中添加一些东西?难道不应该把unity的代码加入到我的工作中吗?我做错了什么,或者是团结还是两者兼而有之?我真的只想能够使用Unity测试C代码。任何帮助都将不胜感激。提前谢谢

首先,尝试“gcc*.c-o mytest”。这将把所有C源文件编译成目标文件,然后将它们链接到二进制文件“mytest”中。请记住,所有C源文件在链接到一起之前都必须编译为对象文件。(库只是一堆打包的对象文件。)

如果在/usr/lib中安装了unity库,则可以执行类似于“gcc mycode.c-lunity-omytest”的操作。如果当前目录中有unity库,则可以执行“gcc mycode.c./unity.a-o mytest”。这告诉编译器在当前目录中查找名为“unity.a”的文件。有些库生成.so文件(“共享对象”文件,类似于Windows中的DLL)。如果是这样,用“unity.so”替换“unity.a”应该有效。(我假设这里是Unix/Linux环境。)


作为Unity的替代方案,看看Google Test,它可以与C代码一起使用。我知道Mac也支持它。主要的好处是一个庞大而活跃的社区。关于谷歌测试的更多信息来自另一个SO问题:

我解决了我的问题。事实证明,unity要求您定义一个
设置
和一个
拆卸
函数,如果您不这样做,您将得到与我遇到的错误类似的错误

我尝试了“gcc*.c-omytest”,但仍然出现了“ld:symbol(s)notfoundforarchitecture x86_64”错误。至于安装它,我不确定如何达到这一点,因为我似乎无法构建它。