c++ 通用makefile
直接上我的makefile万能模板
CC=g++
#CFLAGS= -O3 -g0 -Wall -std=c++11
CFLAGS= -O0 -g3 -Wall -DBOOST_LOG_DYN_LINK
# -DBOOST_LOG_USE_COMPILER_TLS -std=c++11
INCLUDES=-I/usr/local/include -I$(SRC_PATH)
LIBS=-L/usr/local/lib -lboost_log -lboost_log_setup -lboost_thread -lboost_system -lrt -lpthread -lopencv_core -lopencv_highgui -lopencv_imgproc
OBJ_PATH=build
SRC_PATH=src
SRC_DIRS := $(shell find $(SRC_PATH)/* -type d)//获取目录的路径 这是关于find的用法
OBJ_DIRS := $(SRC_DIRS:$(SRC_PATH)/%=$(OBJ_PATH)/%)//目录获取后这一句生成在目标目录下构建src 下的目录 并且是字符串的形式
MKDIR := mkdir -p
RM := rm -rf
$(info 'src_dirs = ' $(SRC_DIRS))//打印
$(info 'obj_dirs = ' $(OBJ_DIRS))
SRC := $(shell find $(SRC_PATH) -name *.cc)
OBJ := $(SRC:$(SRC_PATH)/%.cc=$(OBJ_PATH)/%.o)//在目标目录创建与src对应的.o文件
OBJ_SERVER += $(filter-out $(OBJ_PATH)/client/%.o, $(OBJ))//可以根据需求过滤不需要的.o
OBJ_CLIENT += $(filter-out $(OBJ_PATH)/server/%.o, $(OBJ))
$(info "obj_client = " $(OBJ_CLIENT))
$(info "obj_server = " $(OBJ_SERVER))
all: directories $(OBJ) $(OBJ_PATH)/tcp_client $(OBJ_PATH)/tcp_server//all是一个目标集 后面的三个对象是三个编译对象,编译对象可以在之后自己写编译规则
directories:
$(MKDIR) $(OBJ_DIRS)
$(OBJ_PATH)/tcp_client:$(OBJ_CLIENT) $(OBJ_PATH)/server/tcp_server.o
$(CC) $(CFLAGS) $^ -o $@ $(LIBS)//链接
$(OBJ_PATH)/tcp_server:$(OBJ_SERVER)
$(CC) $(CFLAGS) $^ -o $@ $(LIBS)//链接
$(OBJ_PATH)/%.o:$(SRC_PATH)/%.cc
$(CC) $(CFLAGS) $< -o $@ $(INCLUDES) -c//编译
clean:
$(RM) $(OBJ_PATH)/*
解释说明
我的应用环境是有一个build文件夹,一个src文件夹,src里有不同的分类文件夹,这些文件夹里就是不同作用的文件了。
主目录的长这样
src下长这样
make后的build长这样