自己使用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)
######-----------------------------------------------------------#####