我知道已經有類似的標題,但沒有幾個問題似乎提供了一個答案,我需要什麼(糾正我,如果我錯了)。編譯多個**在GNU改變**源文件一次讓
考慮這個Makefile:
SOURCES=file1.cpp file2.cpp file3.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=myprog
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CXX) -o [email protected] $(OBJECTS)
file1.o: file1.cpp file1.h
file2.o: file2.cpp file2.h file1.h
file3.o: file3.cpp
.cpp.o:
$(CXX) $(CXXFLAGS) -c -o [email protected] $<
如果我改變file1.h,以下運行:
g++ -c -o file1.o file1.cpp
g++ -c -o file2.o file2.cpp
g++ -o myprog file1.o file2.o file3.o
我想擁有的是:
g++ -c file1.cpp file2.cpp
g++ -o myprog file1.o file2.o file3.o
(我知道我不能用GCC指定對象輸出目錄,但是我可以忍受;應該可以解決一些問題cd
命令。)
在nmake中,這是通過雙冒號推理規則(所謂的「batch-mode rule"」)完成的。基本上,它爲多個目標分組推理規則(例如「.obj.cpp:」),併爲所有依賴項調用編譯器,而不是每個文件一次。 $<
變量獲取依賴關係列表,而不是第一個。
現在我們正在使用並行建設(使-j),但它有自己的問題,和VC++編譯器工作在一個調用模式更好,所以我寧願使用。
爲什麼你的'all'目標取決於你的'$(SOURCES)'?這是不需要的,因爲你的'$(OBJECTS)'已經依賴於它們了。 – 2011-05-18 15:50:59
這只是我找到的一個例子。在我們的makefile中(它們非常複雜),我們只依賴最終的可執行文件。無論如何,這不是問題所在。 – 2011-05-18 15:53:45
gcc包裝只是多次調用cc1,gas等。您將保存的唯一程序調用是gcc包裝器本身。 – 2011-05-18 18:42:03