2011-05-24 54 views
1

變量I具有以下生成文件生成文件有時會忽略配方

CXX = g++ 
CXXFLAGS = -g -Wall 
COMPILE = ${CXX} ${CXXFLAGS} -c 
LINK = ${CXX} -lpthread 
LIB_INC = -Ilib -Iwrappers -Iprocesses 

src := $(wildcard lib/*.cpp) $(wildcard wrappers/*.cpp) 
obj = $(src:.cpp=.o) 

src_1 := processnetwork_part001.cpp sc_application_1.cpp 
obj_1 = $(src_1:.cpp=.o) 
src_2 := processnetwork_part002.cpp sc_application_2.cpp 
obj_2 = $(src_2:.cpp=.o) 

all : sc_application_1 sc_application_2 
.PHONY : all 

sc_application_1 : ${obj} ${obj_1} 
    ${LINK} -o sc_application_1 $(obj) ${obj_1} 

sc_application_2 : ${obj} ${obj_2} 
    ${LINK} -o sc_application_2 $(obj) ${obj_2} 

%.o : %.cpp %.h 
    ${COMPILE} -o [email protected] $< $(LIB_INC) 

clean : 
    rm sc_application_1 sc_application_2 ${obj} ${obj_1} ${obj_2} 

其中lib,包裝和處理與目錄的子目錄,其中生成文件和兩個主要應用sc_application_1和sc_application_2被存儲。當我運行make時,我得到以下輸出(只有最後幾行沒有編譯器警告)。因爲某種原因,我不明白,不再被添加到

g++ -g -Wall -c -o sc_application_1.o sc_application_1.cpp 

變量LIB_INC但它是以前所有線路

g++ -g -Wall -c -o lib/Scheduler.o lib/Scheduler.cpp -Ilib -Iwrappers -Iprocesses 
g++ -g -Wall -c -o wrappers/consumer_wrapper.o wrappers/consumer_wrapper.cpp -Ilib -Iwrappers -Iprocesses 
g++ -g -Wall -c -o wrappers/generator_wrapper.o wrappers/generator_wrapper.cpp -Ilib -Iwrappers -Iprocesses 
g++ -g -Wall -c -o wrappers/square_wrapper.o wrappers/square_wrapper.cpp -Ilib -Iwrappers -Iprocesses 
g++ -g -Wall -c -o processnetwork_part001.o processnetwork_part001.cpp -Ilib -Iwrappers -Iprocesses 
g++ -g -Wall -c -o sc_application_1.o sc_application_1.cpp 
In file included from wrappers/wrappers.h:4:0, 
       from sc_application_1.cpp:10: 
wrappers/generator_wrapper.h:4:28: fatal error: ProcessWrapper.h: No such file or directory 
compilation terminated. 
make: *** [sc_application_1.o] Error 1 

編譯失敗(如我意)。任何人都可以解釋我這種行爲?謝謝。

編輯:當我省略「%.o」目標中的「%.h」時,不會發生該錯誤。

回答

3

我要去無路可退,並猜測是沒有sc_application_1.h,但有每一個先前源(例如Scheduler.hconsumer_wrapper.h ...)的頭文件。

如果沒有%.h,則您的%.o: %.cpp %.h規則不適用,因此Make使用默認規則,該規則不使用LIB_INC。解決此問題的最簡單方法是添加另一個%.o規則:

%.o : %.cpp %.h 
    ${COMPILE} -o [email protected] $< $(LIB_INC) 

%.o : %.cpp 
    ${COMPILE} -o [email protected] $< $(LIB_INC) 
+0

非常感謝您,確實是這個問題。 – simon 2011-05-24 12:37:09

+0

這會成爲訂單唯一的前提條件嗎? – Teeeeeeeeeeeeeeeeeeeeeeeeeeeej 2015-12-17 23:02:11