我有一個項目結構像這樣:跨編譯使用GNU不同的目錄,使
mcts/
src/
node_queue.c
node_queue.h
tests/
munit.c # testing frame work
munit.h
list_test.C# includes node_queue.h and munit.h
Makefile # Makefile in question
所以在這裏我的目標是編譯測試MCTS /測試/ list_test.c。我已經閱讀了幾個不同的策略來做到這一點。讀了一下後,我適應一些事情我從Makefile文件到這一點:
CC= gcc
SOURCE= $(wildcard ../src/*.c ./*.c)
OBJECTS= $(patsubst %.c, %.o, $(SOURCE))
INCLUDE= -I. -I../src/
CFLAGS= -std=c11 -g $(INCLUDE) -Werror -Wall
list_test: list_test.o munit.o ../src/node_queue.o
$(CC) $(CFLAGS) $(INCLUDE) -o [email protected] list_test.o munit.o ../src/node_queue.o
.c.o:
$(CC) $(CFLAGS) -c $< -o [email protected]
這是我在約2小時讀懂了工作,調用mcts/tests
make
當最接近我收到錯誤:
list_test.o: In function `construct_test':
/home/----/mcts/tests/list_test.c:9: undefined reference to `construct'
collect2: error: ld returned 1 exit status
make: *** [Makefile:8: list_test] Error 1
其中構建在mcts/src/node_queue.h
中定義。 不應該$(INCLUDE)
確保包含標題? 我怎樣才能得到這個功能?
非常感謝!
首先,你不需要'.co'規則 - Make有內置的。 – Novelocrat
其次,最好使用'VPATH'來指定你想要的目錄搜索對象,而不是烘焙路徑進入你的依賴和命令。即你會說'list_test:list_test.o munit.o node_queue.o',然後規則會運行帶有參數'-o $ @ $ ^'的命令來告訴它僅僅引用所有的依賴關係,無論它在哪裏找到它們。 – Novelocrat
@Novelocrat我正在研究'VPATH',但正在閱讀[this](http://make.mad-scientist.net/papers/how-not-to-use-vpath/),這看起來好像更好嘗試其他方法。 –