我对C非常陌生,遇到以下问题:我制作了一个非常小的程序filecopy.c,我想用Check对其进行单元测试,但是当我进行单元测试并构建它时,我得到大量未定义的参考错误,好像 Eclipse 找不到库 libcheck(我通过在项目 - 属性 - C++ 构建 - 设置 - 库中添加“检查”来指定)。
这是我文件中的相关代码:
文件复制.c
#include <stdio.h>
int fileCopy()
{
int c;
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
文件复制.h
int fileCopy();
文件copyTest.c
#include <stdio.h>
#include <stdlib.h>
#include <check.h>
#include "filecopy.h"
START_TEST (test_fileCopy)
{
int i;
for (i = 0; i < 10; ++i) {
putchar(i);
}
fileCopy();
//Fail if the last char put by fileCopy is not 9
fail_unless(getchar()==9);
}
END_TEST
Suite *
fileCopy_suite (void)
{
Suite *s = suite_create ("fileCopy");
/* Core test case */
TCase *tc_core = tcase_create ("Core");
tcase_add_test (tc_core, test_fileCopy);
suite_add_tcase (s, tc_core);
return s;
}
int
main (void)
{
int number_failed;
Suite *s = fileCopy_suite ();
SRunner *sr = srunner_create (s);
srunner_run_all (sr, CK_NORMAL);
number_failed = srunner_ntests_failed (sr);
srunner_free (sr);
return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}
测试代码完全符合检查教程的要求,并且文件复制程序可以自行运行。这是 Eclipse 使用此设置生成的 Makefile:
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
-include ../makefile.init
RM := rm -rf
# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include objects.mk
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif
-include ../makefile.defs
# Add inputs and outputs from these tool invocations to the build variables
# All Target
all: Homework1
# Tool invocations
Homework1: $(OBJS) $(USER_OBJS)
@echo 'Building target: $@'
@echo 'Invoking: GCC C Linker'
gcc -o "Homework1" $(OBJS) $(USER_OBJS) $(LIBS)
@echo 'Finished building target: $@'
@echo ' '
# Other Targets
clean:
-$(RM) $(OBJS)$(C_DEPS)$(EXECUTABLES) Homework1
-@echo ' '
.PHONY: all clean dependents
.SECONDARY:
-include ../makefile.targets
我告诉 Eclipse 构建 filecopy.c 文件,然后构建 filecopyTest.c 文件,它为我在 filecopyTest.c 内部调用的每个函数提供了一个“对 [function_name] 的未定义引用”(包括没有意义的 fileCopy,因为它包括该函数的标头,甚至不必导入库)。库文件实际上存在于 /usr/lib 中并正确安装(当手动运行 gcc 时,它编译得很好并且似乎可以运行(尽管可能有一些错误;很难说))。
如果您对在 Eclipse 中使用 C 进行单元测试有任何经验,请提供帮助。我非常喜欢 Eclipse 并希望将它用于我的新 C 项目,但我也喜欢测试优先编程,并且不打算在没有测试的情况下为 C 开发项目。我在使用 CUnit 时遇到了同样的问题,并认为 Check 可能会更好,但显然我做错了,作为一个 COMPLETE C 菜鸟,我不明白。我搜索了互联网,发现了多篇关于类似情况的“已解决”文章,但在 Eclipse 上实施他们的解决方案并没有帮助我。我不明白 Eclipse 对 make 文件做了什么,甚至完全不了解链接是什么以及它是如何失败的,但我只想在 Eclipse 中通过单元测试对 C 进行编程,经过数小时尝试解决这个问题,它似乎是一个无法完成的任务。如果您需要更多信息,请告诉我;我使用 Eclipse Indigo 作为参考,它使用 CDT 8.0.2。
提前感谢您为任何人提供的任何帮助。了解单元测试及其有用性,然后了解 C 及其性能,然后得知我无法将两者放在我最喜欢的 IDE 中,这真是令人沮丧。