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