2016-08-03 35 views
0

我有一個項目結構像這樣:跨編譯使用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/testsmake當最接近我收到錯誤:

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)確保包含標題? 我怎樣才能得到這個功能?

非常感謝!

+0

首先,你不需要'.co'規則 - Make有內置的。 – Novelocrat

+0

其次,最好使用'VPATH'來指定你想要的目錄搜索對象,而不是烘焙路徑進入你的依賴和命令。即你會說'list_test:list_test.o munit.o node_queue.o',然後規則會運行帶有參數'-o $ @ $ ^'的命令來告訴它僅僅引用所有的依賴關係,無論它在哪裏找到它們。 – Novelocrat

+0

@Novelocrat我正在研究'VPATH',但正在閱讀[this](http://make.mad-scientist.net/papers/how-not-to-use-vpath/),這看起來好像更好嘗試其他方法。 –

回答

1

對於您的實際錯誤,您正在向未定義的符號報告鏈接錯誤。如果在node_queue.h中定義了該名稱的對象或功能,則您將改爲爲construct獲取多重定義錯誤。

您可能缺少的是您在該標題中有聲明,但在node_queue.c中沒有定義。

+0

是的,我剛剛失去了5個小時拼寫建設作爲contsruct ...但我確實有我的Makefile現在的順序 [gist](https://gist.githubusercontent.com/Beaudidly/b374790854a91f2e3f3f1c077381c571/raw/2c1488010ebc7d3c11b26bf34add51c63e04da25/Makefile) –

+0

它發生在我們所有人身上。 – Novelocrat

相關問題