1

小さなCプログラム用のMakefileを書き込もうとしています。構造は

project_root

  • src(ソースファイル)
  • テスト(テストファイル)
  • ビルド(プログラムバイナリ)

私のmakeファイルは以下の通りです。

CFLAGS = -g -Wall -Isrc $(OPTFLAGS)
LDLIBS = $(OPTLIBS)

PREFIX ?= /usr/local/
OPTVALGRIND="valgrind --track-origins=yes --log-file=tests/valgrind.log"

TARGET_SRC = src/hello_make.c
TARGET = build/hello_make

SOURCES := $(wildcard src/*.c)
SOURCES := $(filter-out $(TARGET_SRC),$(SOURCES))

OBJECTS = $(patsubst %.c,%.o,$(SOURCES))

TEST_SRC = $(wildcard tests/*_tests.c)
TESTS = $(patsubst %.c,%,$(TEST_SRC))
TEST_FILE ?= hello_make_tests

all: $(TARGET) tests

$(TARGET): build $(OBJECTS)
    $(CC) $(CFLAGS) $(TARGET_SRC) $(OBJECTS) $(LDLIBS) -o $@ 

.PHONY: compile_tests tests test testv valgrind build clean
compile_tests: LDLIBS += -lrt -lm
compile_tests: CFLAGS += $(OBJECTS)
compile_tests: build $(OBJECTS) $(TESTS)
    @echo "TARGET=$(TARGET), TESTS=$(TESTS)"
    @echo "compile_tests done"

tests: compile_tests
    sh ./tests/run_tests.sh

test: compile_tests
    sh ./tests/run_test.sh tests/$(TEST_FILE)

testv: compile_tests
    sh ./tests/run_test.sh tests/$(TEST_FILE)

valgrind:
    VALGRIND=$(OPTVALGRIND) $(MAKE) -s

clean:
    rm -rf $(OBJECTS)
    rm -rf $(TARGET)
    rm -rf $(TESTS)
    rm -rf build
    rm -rf tests/*.log

build:
    @mkdir -p build

ターゲットテストとtestv(valgrindでの実行に対応)があります。だから私がそうするとき、

make test TEST_FILE=hello_make_tests

このテストに必要なものをすべて構築する必要があります。次に、tests/hello_make_testsを実行します。

ほとんどのMakefileが機能しています。ソースファイルをビルドしてコンパイルし、それらをテストプログラムにリンクします。$ \

私の問題は、これは、最初にmake allを使用し、次にmaketest使用した場合にのみ機能することです。私がきれいにした後、テストをするとき。次のエラーが発生します。

cc -g -Wall -Isrc  src/get_one.o src/get_three.o src/get_two.o   -c -o src/get_one.o src/get_one.c
cc: error: src/get_one.o: No such file or directory
cc: error: src/get_three.o: No such file or directory
cc: error: src/get_two.o: No such file or directory
make: *** [src/get_one.o] Error 1

cc呼び出しは、ソースとして機能するオブジェクトファイルで間違っているように見えますか?私は作るのがかなり新しく、これを理解することができません。助けてください。

4

1 に答える 1

1

この行

compile_tests: CFLAGS += $(OBJECTS)

コンパイル時に暗黙のルール (make に組み込まれている) によって使用される CFLAGS 変数にすべてのオブジェクトを追加します。

この種の混乱を避けるために、ソース、コンパイラ フラグ、および結果のオブジェクト ファイルを makefile 内で分けておくようにしてください。

使用方法が不明な場合は、メイクファイル フラグのドキュメントを参照してください。

于 2012-10-15T14:02:13.467 に答える