我試圖設置一個Makefile來處理來自一組源的兩個不同的目標,並且我有點超出了我的元素。它絕大多數工作正常,但我的依賴結構被破壞,因此我不得不每次都進行完整的重新編譯。有削減下來示例如下:基於目標的Makefile中的不同依賴位置
first: OBJDIR = obj
second: OBJDIR = obj-2
SRCS = $(wildcard src/*.cc)
OBJECTS = $(patsubst %.cc,$(OBJDIR)/%.o,$(SRCS))
first: CFLAGS = -g -Wall -Wextra -std=c++11 -MMD
second: CFLAGS = -g -Wall -Wextra -std=c++11 -MMD -DCOMPILE_FLAG
$(OBJDIR)/%.o: %.cc
@mkdir -p $(OBJDIR)/src
clang++ -c $(CFLAGS) -o $(OBJDIR)[email protected] $<
#DEPENDENCIES AREN'T WORKING PROPERLY
-include $(OBJECTS:.o=.d)
first: $(OBJECTS)
clang++ -o gen/first $(OBJECTS)
second: $(OBJECTS)
clang++ -o gen/second $(OBJECTS)
如果我將first:
可執行代下@echo $(OBJECTS:.o=.d)
(或因爲它是在編譯步驟中使用),它正確地擴展到/obj/src/filename.d
。但是,當它在包含行中時,它僅顯示爲/src/filename.d
。顯然.d
文件不存在於該位置,所以它找不到它們並執行完整的重新編譯。
Makefiles並不是我經驗豐富的東西,所以如果有更好的方法來完成上述任何事情,我就會全神貫注。但關鍵點是能夠從同一個源擁有兩組目標文件和兩組依賴項。
-
要澄清的最終目標是什麼,我是一組用於建立兩個獨立的可執行文件,通過#ifdef
小號處理的差異源文件。
我想從makefile結構中得到的是帶有兩個目標的單個makefile。每個目標都會生成自己的.o/.d文件,以便在對源進行更改時,我可以運行make first
和make second
以生成兩個新的可執行文件,而無需從頭開始重新編譯所有文件。我之前通過使用兩個獨立的makefile來處理這個問題,但這似乎是錯誤的。
啊,是的,我顯然做到了。這就回答了爲什麼它不起作用的主要問題。至於其他方面,我對你的最後一段並不感到驚訝。請參閱我的編輯進一步澄清。 –