我有一個目前效果很好的Makefile。雖然隨着它開始增長,每次重新編譯所有來源開始花費太長時間。下面是從工作版本的代碼段:Makefile - 文件夾中的依賴文件「沒有這樣的文件或目錄」
CC=$(CROSS_COMPILE)g++
CFLAGS=-Wall -I./include -pg -O2
VPATH=./src:./include
all: dotgazer.cpp dotgazer/Dot.cpp
$(CC) $(CFLAGS) $^ -o dotgazer.out `pkg-config --libs opencv`
有很多更依賴,但是這兩個都足以說明是什麼問題。我正試圖將每個cpp
文件的編譯階段移至單獨的目標。當涉及到頂級文件(dotgazer.cpp
)這不是一個問題,一般規則%.o: %.cpp
工作正常。但是我無法獲得第二個依賴。下面是它現在的樣子:
CC=$(CROSS_COMPILE)g++
CFLAGS=-Wall -I./include -pg -O2
VPATH=./src:./include
all: dotgazer.o dotgazer/Dot.o
$(CC) $(CFLAGS) $^ -o dotgazer.out `pkg-config --libs opencv`
%.o: %.cpp
$(CC) -c $(CFLAGS) $^ -o [email protected]
dotgazer/Dot.o: dotgazer/Dot.cpp
$(CC) -c $(CFLAGS) $^ -o [email protected]
我已經試過Dot.o
規則的不同變化,但他們都不似乎工作。我得到的錯誤是:
Fatal error: can't create dotgazer/Dot.o: No such file or directory
我應該怎麼做?我最希望將.o
文件放在與其來源相同的文件夾中。此外,我會感謝一般規則(如%.o: %.cpp
),因爲有很多源文件,我不希望Makefile過於臃腫。謝謝!
我可能是啞巴,但不是'%的.o:%.cpp'和'dotgazer/Dot.o:dotgazer/Dot.cpp'規則增加了一倍?比如,是不是前者已經處理了後者的目標? –
@AdamGoodwin我認爲它會以這種方式工作(只需要'%.o:%.cpp'規則)。但事實證明 - 不。所以我特別爲第二個依賴添加了第二條規則,但它仍然無效。只用'%.o:%.cpp'規則的消息是一樣的:'不能創建dotgazer/Dot.o:沒有這樣的文件或目錄' – Wojtek
嗯,我只是試過你的makefile,它對我來說工作得很好。它甚至可以只用'%.o'目標,也不需要'dotgazer/Dot.o'目標。你有沒有犯過錯誤的文件名或目錄有嗎?或者你是否在做一些像從自己的目錄以外的地方運行makefile? –