makefile 簡要用法

自己使用makefile簡要記錄,目錄如下:

### 1. make簡單初使用
######------------------------#####
CC = g++
src = test.cpp
obj = test.o
exec = test

#格式如下

# 目標文件 :依賴文件
    # 執行命令行

$(exec):$(obj)
	$(CC) $(obj) -o $(exec) 
	#g++ test.o -o test

$(obj):$(src)
	$(CC) $(src) -c
	#g++ test.cpp -c

.PHONY:clean   #.PHONY 僞目標,防止與目標文件相重
clean:
	-rm $(obj) $(exec) # 類似bash裏面的命令
######------------------------#####
### 2. make編譯ssh
######-----------------------------------------------------------#####
CC = g++
src = encryption.cpp
obj = encryption.o
exec = encryption

$(exec):$(obj)
# -L 鏈接庫文件所在路徑 \ -l 鏈接庫名 libcypto.so 
    # $(CC) $(obj) -o $(exec) -L /home/zjl/anaconda3/ssl -l crypto
# 若庫名位於 /lib, /usr/lib 和 /usr/local/lib 下,可以直接使用 -l 而不需要 -L
	$(CC) $(obj) -o $(exec) -l crypto

# $(obj):$(src)
# 	$(CC) $(src) -c

# 可以自動從-cpp文件推導得到-o文件 -->隱式規則
$(obj):

.PHONY:clean
clean:
	-rm $(obj) $(exec)
# 刪除產生的密鑰文件
	-rm *.pem
######-----------------------------------------------------------#####
### 3. make編譯protobuf

3.1 利用僞目標直接Bash 編譯(可拓展性不強)
######------------------------------#####
all:address
address:
    protoc address.proto --cpp_out=.
######------------------------------#####

3.2 編譯多個
######-----------------------------------------------------------#####
PROTOCC = protoc
INCLUDE = .
#注意這裏-- cpp_out=. 不要有多餘的空格
PROTO_FLAG = --cpp_out=$(INCLUDE)

PROTO_SOURCES = $(wildcard *.proto)
# # $(warning $(PROTO_SOURCES))  # 輸出變量值

OBJ := $(PROTO_SOURCES:%.proto=$(INCLUDE)/%.pb.cc)
OBJ += $(PROTO_SOURCES:%.proto=$(INCLUDE)/%.pb.h)

# OBJ := $(patsubst %.proto, $(INCLUDE)/%.pb.cc, $(wildcard  *.proto))
# OBJ += $(patsubst %.proto, $(INCLUDE)/%.pb.h, $(wildcard  *.proto))
# $(warning $(OBJ))

all:$(OBJ) #$(OBJ)雖然沒有直接在下文體現,但貌似支持了 %.pb.cc 這種語法

.PHONY:all
$(INCLUDE)/%.pb.cc : %.proto
	$(PROTOCC)  $^ $(PROTO_FLAG)    #  $^ == %.proto == 所有依賴文件
	@echo 'generate file' $@

clean:
	-rm *.pb.cc *.pb.h
######-----------------------------------------------------------#####
### 4. make進階使用
######-----------------------------------------------------------#####
# 告訴make
vpath %.cpp src      #當前文件目錄下不存在.cpp文件時,到src文件夾查找
vpath %.h include    #                   .h           include
# 告訴編譯器
CC = g++
CPPFLAG = -I include
SRC = hello.cpp
INCLUDE = hello.h
OBJ = hello.o
EXEC = hello

$(EXEC) : $(OBJ)
	$(CC) $^ -o $@  # $@ == $(EXEC) == 目標文件

$(OBJ) : $(SRC) $(INCLUDE)
	$(CC) $(CPPFLAG) -c $<  # $< == $(SRC) == 第一個依賴文件

.PHONY:clean
clean:
	-rm $(OBJ) $(EXEC)
######-----------------------------------------------------------#####

 

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