2012-10-15 55 views
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 

消委會呼籲似乎是錯誤的目標文件作爲來源?我很新,並且 無法解決這個問題。請幫忙。

回答

1

此行

compile_tests: CFLAGS += $(OBJECTS) 

將所有對象編譯時的CFLAGS變量,它由隱規則(內置到MAKE)使用。

儘量將源代碼,編譯器標記和生成的目標文件分開存放在makefile中以避免這種混淆。

如果您不確定其使用情況,請快速查看makefile標誌的文檔。

+0

謝謝。我只添加該行,因爲它不會將src文件與測試文件鏈接起來... – mathguy80

+0

@ mathguy80不客氣。這是否解決了您的問題,或者是否有更多信息可以添加到您的問題中? – HonkyTonk

+0

是的,謝謝。 Make手冊寫得很好。我最終爲$(TESTS)寫了一個隱式規則,它執行$(CC)$(OBJECTS)$ @。c -o $ @。 – mathguy80

相關問題