3

私は C に非常に慣れていないので、次の問題があります。非常に小さなプログラム filecopy.c を作成しました。Check を使用して単体テストを行いたいのですが、単体テストを作成してビルドすると、 Eclipse がライブラリ libcheck を見つけられないかのように、未定義の参照エラーが大量に発生します (プロジェクト - プロパティ - C++ ビルド - 設定 - ライブラリに「チェック」を追加して指定しました)。

私のファイルからの関連コードは次のとおりです。

filecopy.c

#include <stdio.h>

int fileCopy()
{
  int c;

  while ((c = getchar()) != EOF) {
    putchar(c);
  }
  return 0;
}

filecopy.h

int fileCopy();

filecopyTest.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;
 }

テスト コードは、チェック チュートリアルに従っているべきものとまったく同じであり、filecopy プログラムは単独で動作します。このセットアップを使用して 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の方がうまくいくと思いましたが、完全なC初心者として理解できないのは明らかに間違っています。私はインターネットを精査し、同様の状況に関する「解決済み」の記事を複数見つけましたが、それらのソリューションを実装しても Eclipse では役に立ちませんでした。Eclipse が make ファイルで何をするのか、あるいはリンクとは何か、どのように失敗するのかを完全には理解していませんが、単体テストを使用して Eclipse で C をプログラムしたいだけで、この問題を解決しようと何時間も試みた後、乗り越えられない仕事。追加情報が必要な場合はお知らせください。CDT 8.0.2 を使用する Eclipse Indigo を参照用に使用しています。

誰かが私に与えることができるかもしれないどんな助けにも前もって感謝します. 単体テストとその有用性について学び、次に C とそのパフォーマンスについて学び、お気に入りの IDE 内でこの 2 つを組み合わせることができないことを学ぶのは、とても憂鬱です。

4

0 に答える 0