8)objects = *.o
通配符同樣可以用在變量中。并不是說[*.o]會展開,objects的值就是“*.o”。Makefile 中的變量其實就是 C/C++中的宏。如果你要讓通配符在變量中展開,也就是讓 objects 的值是所有[.o]的檔案名的集合,那麼,你可以這樣:objects := $(wildcard *.o),這種用法由關鍵字“wildcard”指出。
9)通過makefile編譯,自動推導,如果發現目前的檔案沒有做過更新,則不會編譯,隻編譯更新過了的。
附:
1、預定義變量選項
預定義變量
含義
$*
不包含擴充名的目标檔案名稱。
$+
所有的依賴檔案,以空格分開,并以出現的先後為序,可能包含重複的依賴檔案。
$<
第一個依賴檔案的名稱。
$?
所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目标的建立日期晚。
$@
目标的完整名稱。
$^
所有的依賴檔案,以空格分開,不包含重複的依賴檔案。
$%
如果目标是歸檔成員,則該變量表示目标的歸檔成員名稱。例如,如果目标名稱為 mytarget.so(image.o),則 $@ 為 mytarget.so,而 $% 為 image.o。
AR
歸檔維護程式的名稱,預設值為 ar。
ARFLAGS
歸檔維護程式的選項。
AS
彙程式設計式的名稱,預設值為 as。
ASFLAGS
彙程式設計式的選項。
CC
C 編譯器的名稱,預設值為 cc。
CCFLAGS
C 編譯器的選項。
CPP
C 預編譯器的名稱,預設值為 $(CC) -E。
CPPFLAGS
C 預編譯的選項。
CXX
C++ 編譯器的名稱,預設值為 g++。
CXXFLAGS
C++ 編譯器的選項。
2、make 選項
指令行選項
含義
-C DIR
在讀取 makefile 之前改變到指定的目錄 DIR。
-f FILE
以指定的 FILE 檔案作為 makefile。
-h
顯示所有的 make 選項。
-i
忽略所有的指令執行錯誤。
-I DIR
當包含其他 makefile 檔案時,可利用該選項指定搜尋目錄。
-n
隻列印要執行的指令,但不執行這些指令。
-p
顯示 make 變量資料庫和隐含規則。
-s
在執行指令時不顯示指令。
-w
在處理 makefile 之前和之後,顯示工作目錄。
-W FILE
假定檔案 FILE 已經被修改。
3、示例代碼
CC=gcc
CXX=g++
CFLAGS= -g -Wall
INC=./***
LIB=./***.a
CFLAGS+= -DSNACC_DEEP_COPY -DHAVE_VARIABLE_SIZED_AUTOMATIC_ARRAYS -Wno-deprecated -lpthread -lssl
TARGET=***
OBJ = **.o \
./**.o\
$(TARGET): $(OBJ)
$(CXX) $(CFLAGS) -o $@ $^ $(LIB)
#如下代碼,把所有的cpp檔案編譯成.o檔案
%.o: %.cpp
$(CXX) $(CFLAGS) $(INC) -c -o $@ $<
clean:
rm -f *.o
rm -f $(TARGET)
參考