2

C単体テストにCheckを使用しています。作成する C ライブラリ ファイルごとに、テストとソース コードからリンクされた単一の実行可能ファイルを生成する 1 つのテスト ファイルが必要です。次に、この実行可能ファイルを実行して、すべてのテストに合格することを確認する必要があります。

1 つのテスト ファイルと 1 つのソース ファイルしかない場合、すべてがうまく機能します。対応するテスト ファイルを含む 2 つ目のソース ファイルを追加するとすぐに、それらすべてを 1 つの実行可能ファイルにリンクしようとします。

1 つの TEST_SRC と一致する SRC およびヘッダー ファイルを TEST_OBJ にプルし、2 つのオブジェクト ファイルを実行可能ファイルにコンパイルする 2 番目のルールを取得するにはどうすればよいですか? 以下は私の現在のMakefileです

OUT_DIR=bin
BUILD_DIR=build
TEST_BUILD_DIR=test_build
SRC_DIR=src
TEST_SRC_DIR=tests
SRC= $(wildcard $(SRC_DIR)/*.c)
TEST_SRC= $(patsubst $(SRC_DIR)/%.c, $(TEST_SRC_DIR)/%_tests.c, $(SRC))
TEST_OBJ= $(patsubst $(TEST_SRC_DIR)/%.c, $(TEST_BUILD_DIR)/%.o, $(TEST_SRC))
OBJ= $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRC))

$(OUT_DIR)/string_calculator_tests: $(TEST_OBJ)
    gcc -o $@ $^ `pkg-config --cflags --libs check`

$(TEST_OBJ): $(TEST_SRC) $(SRC)
    gcc -c -o $@ $^ `pkg-config --cflags --libs check`

どんな助けでも大歓迎です。

4

1 に答える 1

3

このメイクファイルをどのように動作させたいのか正確には少しわかりませんが、段階的に行うことができます。

このルールを見てください:

$(TEST_OBJ): $(TEST_SRC) $(SRC)
    gcc -c -o $@ $^ `pkg-config --cflags --libs check`

オブジェクトは、すべてのソース ファイルから構築されます。そして、あなたにはルールがないようですOBJ。では、これを 2 つの静的パターン ルールに置き換えてみましょう。

$(TEST_OBJ): $(TEST_BUILD_DIR)/%.o : $(TEST_SRC_DIR)/%.c
    gcc -c -o $@ $< `pkg-config --cflags --libs check`

$(OBJ): $(BUILD_DIR)/%.o : $(SRC_DIR)/%.c
    gcc -c -o $@ $< `pkg-config --cflags --libs check`

次に、オブジェクト ファイルのペアから実行可能ファイルを作成するルール:

TESTS = $(patsubst $(SRC_DIR)/%.c, $(TEST_BUILD_DIR)/%_test, $(SRC))

$(TESTS): $(TEST_BUILD_DIR)/%_test : $(BUILD_DIR)/%.o $(TEST_BUILD_DIR)/%_tests.o
    gcc -o $@ $^ `pkg-config --cflags --libs check`

次に、すべてのテストを構築するルール:

.PHONY: all_tests

all_tests: $(TESTS)

それはあなたが始めるのに十分なはずです. これが機能すると、テストを実行するターゲットや、.NET などの高度な手法を使用してテストをより適切に記述する方法など、多くの改善が可能になりますvpath。そして、ヘッダーファイルと依存関係の処理についても話しませんでした...

于 2013-10-07T03:39:28.663 に答える