GNU.Make

GNU.Make

Make的詳細用法在以下博客中有介紹,並附詳細的例子。
https://www.cnblogs.com/wang_yb/p/3990952.html

Makefile指定輸出路徑

直接上例子,文件組織如下:

  • src/
    • main.cpp
    • party.cpp
    • party.h
    • speak.h
    • sing.cpp
    • say.cpp
  • obj/

Makefile語法:

D_SRC = src
D_OBJ = obj

D_INC = -I./include
D_LIB = lib

TARGET = hello

# list all the .cpp file in src directory
SOURCES   = $(wildcard $(D_SRC)/*.cpp)
# list all the .cpp file in src directorys
#SOURCES   = $(foreach dir, $(D_SRC), $(wildcard $(dir)/*.cpp))
OBJECTS   = $(addprefix $(D_OBJ)/,$(patsubst %.cpp,%.o,$(notdir $(SOURCES))))

$(TARGET): #$(OBJECTS)
    # g++ -o $@ $^ $(LIB)
    @echo $(SOURCES)

$(D_OBJ)/%.o: $(D_SRC)/%.cpp
    g++ -c -Wall $(INC) $< -o $@ 

clean:
    -rm $(D_OBJ)/*
    -rm $(TARGET)

獲取src中所有的cpp文件

當D_SRC變量爲單個路徑時可以使用第一種方法

SOURCES   = $(wildcard $(D_SRC)/*.cpp)

wildcard-擴展通配符

wildcard爲擴展通配符,即將、$(D_SRC)/*.cpp完整展開爲:src/main.cpp src/party.cpp src/say.cpp src/sing.cpp(以括號間隔)。用法爲:

$(wildcard \$(pattern))

當D_SRC爲多個路徑時,即使用第二種方法。比如D_SRC = src src/a,則SOURECS會列出兩個路徑下的所有cpp文件

SOURCES   = $(foreach dir, $(D_SRC), $(wildcard $(dir)/*.cpp))

foreach-遍歷

語法

$(foreach <var>,<list>,<text>)

示例:

# Makefile 內容
targets := a b c d
objects := $(foreach i,$(targets),$(i).o)

all:
    @echo $(targets)
    @echo $(objects)

# bash 中執行 make
$ make
a b c d
a.o b.o c.o d.o

將.cpp轉化爲.o結尾

OBJECTS   = $(addprefix $(D_OBJ)/,$(patsubst %.cpp,%.o,$(notdir $(SOURCES))))

notdir-取文件名函數

語法

$(notdir <names...>)

功能: 從文件名序列names 中取出非目錄部分

返回: 文件名序列names中的非目錄部分

示例:

# Makefile 內容
all:
    @echo $(notdir /home/a.c ./bb.c ../c.c d.c)

# bash 中執行 make
$ make
a.c bb.c c.c d.c

patsubst-模式字符串替換函數:

語法:

$(patsubst <pattern>,<replacement>,<text>)

功能: 查找text中的單詞(單詞以”空格”, “tab”, “換行”來分割) 是否符合 pattern, 符合的話, 用 replacement替代.

返回: 替換過的字符串

示例:

# Makefile 內容
all:
    @echo $(patsubst %.c, %.o, programA.c programB.c)

# bash 中執行 make
$ make
programA.o programB.o

addprefix-加前綴函數:

語法:

$(addprefix <prefix>,<names...>)

功能: 把前綴 加到 中的每個單詞前面

返回: 加過前綴的文件名序列

示例:

# Makefile 內容
all:
    @echo $(addprefix test_,/home/a.c b.c ./d.c)

# bash 中執行 make
$ make
test_/home/a.c test_b.c test_./d.c

本例參考https://blog.csdn.net/javababy3/article/details/77918228

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章