1
我正在嘗試爲小C程序編寫Makefile。它的結構是「make target」在「make clean」後無法工作
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 [email protected]
.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工作。它構建並編譯源文件,以將這些文件鏈接到測試程序。 $ \
我的問題是,如果這僅適用於我使用讓所有第一再依次化妝測試。 當我做乾淨其次使測試。我收到以下錯誤。
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
消委會呼籲似乎是錯誤的目標文件作爲來源?我很新,並且 無法解決這個問題。請幫忙。
謝謝。我只添加該行,因爲它不會將src文件與測試文件鏈接起來... – mathguy80
@ mathguy80不客氣。這是否解決了您的問題,或者是否有更多信息可以添加到您的問題中? – HonkyTonk
是的,謝謝。 Make手冊寫得很好。我最終爲$(TESTS)寫了一個隱式規則,它執行$(CC)$(OBJECTS)$ @。c -o $ @。 – mathguy80