3

我对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 中,这真是令人沮丧。

4

0 回答 0