# 不用前缀 :: 输出执行的命令以及命令执行的结果, 出错的话停止执行
# 前缀 @ :: 只输出命令执行的结果, 出错的话停止执行
# 前缀 - :: 命令执行有错的话, 忽略错误, 继续执行
#调试信息
# FILE="============xt============="
# $(info $(FILE)) #info信息,不会打印行号
# $(warning $(FILE)) #warning信息会显示行号
#$(error $(FILE)) #error信息会导致编译终止及退出,适合分步调试问题
#echo信息只能在aaa:后面使用,并且前面需要增加一个tab键
# aaa:
# @echo "==========xt1============="
# @echo "$(FILE)"
DEUBG = -D_DEBUG
TARGET1 = rtsp_server
TARGET2 = rtsp_pusher
TARGET3 = rtsp_h264_file
OBJS_PATH = objs
CROSS_COMPILE =
CXX = $(CROSS_COMPILE)g++
CC = $(CROSS_COMPILE)gcc
STRIP = $(CROSS_COMPILE)strip
INC = -I$(shell pwd)/src/ -I$(shell pwd)/src/net -I$(shell pwd)/src/xop -I$(shell pwd)/src/3rdpart
LIB =
LD_FLAGS = -lrt -pthread -lpthread -ldl -lm $(DEBUG)
CXX_FLAGS = -std=c++11
O_FLAG = -O0
CFLAGS += -D_DEBUG
#notdir 用于去掉文件的绝对路径,只保留文件名。
#$(patsubst 原模式, 目标模式, 文件列表)
#patsubst 函数用于将文件模式进行替换。
#wildcard 通配符会被自动展开
# 1、wildcard : 扩展通配符
# 2、notdir : 去除路径
# 3、patsubst :替换通配符
SRC1 = $(notdir $(wildcard ./src/net/*.cpp))
OBJS1 = $(patsubst %.cpp,$(OBJS_PATH)/%.o,$(SRC1))
SRC2 = $(notdir $(wildcard ./src/xop/*.cpp))
OBJS2 = $(patsubst %.cpp,$(OBJS_PATH)/%.o,$(SRC2))
SRC3 = $(notdir $(wildcard ./example/rtsp_server.cpp))
OBJS3 = $(patsubst %.cpp,$(OBJS_PATH)/%.o,$(SRC3))
SRC4 = $(notdir $(wildcard ./example/rtsp_pusher.cpp))
OBJS4 = $(patsubst %.cpp,$(OBJS_PATH)/%.o,$(SRC4))
SRC5 = $(notdir $(wildcard ./example/rtsp_h264_file.cpp))
OBJS5 = $(patsubst %.cpp,$(OBJS_PATH)/%.o,$(SRC5))
# rules
#$@ 表示规则中的目标文件集 目标文件
#$^ 所有的依赖目标的集合。以空格分隔。 .o文件
#$< 依赖目标中的第一个目标名字 .c/.cpp
# $+ 这个变量很像$^,也是所有依赖目标的集合,只是它不去除重复的依赖目标。
# $(info $(OBJS)) 打印信息
all: BUILD_DIR $(TARGET1) $(TARGET2) $(TARGET3)
BUILD_DIR:
@-mkdir -p $(OBJS_PATH)
$(TARGET1) : $(OBJS1) $(OBJS2) $(OBJS3)
$(CXX) $^ -o $@ $(CFLAGS) $(LD_FLAGS) $(CXX_FLAGS)
$(TARGET2) : $(OBJS1) $(OBJS2) $(OBJS4)
$(CXX) $^ -o $@ $(CFLAGS) $(LD_FLAGS) $(CXX_FLAGS)
$(TARGET3) : $(OBJS1) $(OBJS2) $(OBJS5)
$(CXX) $^ -o $@ $(CFLAGS) $(LD_FLAGS) $(CXX_FLAGS)
$(OBJS_PATH)/%.o : ./example/%.cpp
$(CXX) -c -g $< -o $@ $(CXX_FLAGS) $(INC)
$(OBJS_PATH)/%.o : ./src/net/%.cpp
$(CXX) -c -g $< -o $@ $(CXX_FLAGS) $(INC)
$(OBJS_PATH)/%.o : ./src/xop/%.cpp
$(CXX) -c -g $< -o $@ $(CXX_FLAGS) $(INC)
clean:
-rm -rf $(OBJS_PATH) $(TARGET1) $(TARGET2) $(TARGET3)
# $@ 目标集合
# $% 当目标是函数库文件时, 表示其中的目标文件名
# $< 第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标
# $? 比目标新的依赖目标的集合
# $^ 所有依赖目标的集合, 会去除重复的依赖目标
# $+ 所有依赖目标的集合, 不会去除重复的依赖目标
# $* 这个是GNU make特有的, 其它的make不一定支持
Makefile生成多个可执行程序
于 2022-12-16 11:15:05 首次发布