1、makefile 动态库模板
如果子目录下没有嵌套其他子目录,该模板无需修改。如果makefile文件和源文件不在一个目录下,则需要修改根目录 ROOT_DIR
###############################################################################
# 设置编译器、编译选项
###############################################################################
TOOL_CHAIN_PATH = /home/gzx/Desktop/tool/arm-linux/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
CC = $(TOOL_CHAIN_PATH)/arm-linux-gnueabihf-gcc
NFS_PATH = /usr/local/nfsd/rootfs/home/root/workspace/lcd
###############################################################################
# 获取有效子目录
###############################################################################
ROOT_DIR = .
ALL_SUBDIRS = $(shell ls $(ROOT_DIR) -l | grep ^d | awk '{print $$9}') # 获取ROOT_DIR下的所有子目录
EXCLUDE_DIRS = build lcd_test # 不会去编译的目录
VALID_SUBDIRS = $(filter-out $(EXCLUDE_DIRS), $(ALL_SUBDIRS)) # 得到真正会去编译的目录
VALID_SUBDIRS += $(ROOT_DIR) # 加上当前根目录
###############################################################################
# 获取源文件
###############################################################################
SOURCES += $(foreach subdir, ${VALID_SUBDIRS}, $(wildcard ${subdir}/*.c ${subdir}/*.cpp)) # 获取各个子目录下的源文件(含当前目录)
###############################################################################
# 设置目标文件的生成位置
###############################################################################
BUILD_DIR = build
OBJ_DIR = $(BUILD_DIR)/obj
OBJS = $(OBJ_DIR)/*.o
TARGET = $(BUILD_DIR)/libtest.so
# 判断build目录是否存在,存在就清空目录,不在就创建
$(shell \
if test -e $(BUILD_DIR); then \
rm -rf $(BUILD_DIR)/*; \
else \
mkdir -p $(BUILD_DIR); \
fi)
###############################################################################
# 开始生成目标对象
###############################################################################
default: $(TARGET)
$(TARGET): $(OBJS)
${CC} -shared -o $@ $^
###############################################################################
# 提前生成 .o 文件(OBJS)
# - 判断 .c 文件还是 .cpp 文件,都替换成 .o 的样式
# - OBJ 包含路径,去除 OBJ 中的路径
# - 开始编译生成 .o 文件
###############################################################################
define compile
OBJ = $(if $(findstring .c,$1), $(patsubst %.c,%.o,$1), $(patsubst %.cpp,%.o,$1))
NODIR_OBJ = $$(notdir $$(OBJ))
$$(shell $$(CC) -fPIC -o $$(OBJ_DIR)/$$(NODIR_OBJ) -c $1)
endef
$(foreach src_file, ${SOURCES}, $(eval $(call compile, $(src_file)))) # 遍历每一个源文件,同时生成对应的 .o 文件
###############################################################################
# 伪目标
###############################################################################
.PHONY:clean
clean:
rm -rf $(BUILD_DIR)/*
$(shell ls $(DIR2) -l | grep ^d | awk '{print $$9}')
=》ls $(DIR2) -l | grep ^d:输出当前目录的所有文件以及目录等的详细信息,然后筛选出其中只是目录的信息
=》awk '{print $$9}':输出目录详细信息中的目录的名称
2、 生成可执行文件模板
遍历一级目录下的所有子目录,如果子目录下嵌套了其他子目录,那就作为二级子目录处理
# ################################################################
# # 指定编译器、获取源文件、指定目标文件的生成位置
# ################################################################
# 编译器
CXX = gcc
# 目标文件名
TARGET_NAME = main
# 编译选项
CXXFLAGS += -Wall -O3 -std=c++11
# 获取到一级子目录下的源文件
ROOT_DIR = src # 源文件的根目录
SOURCES += $(wildcard ${ROOT_DIR}/*.c) # 获取main函数
FILTER_OUT_DIR = BSW src_fusion # 要滤除的子目录(待添加)
ALL_SUBDIRS = $(shell find ${ROOT_DIR} * -type d | grep -v "\.") # 获取ROOT_DIR下的所有子目录
SUBDIRS = $(filter-out ${FILTER_OUT_DIR},${ALL_SUBDIRS}) # 滤除子目录
SOURCES += $(foreach subdir,${SUBDIRS}, $(wildcard ${subdir}/*.c))
# 获取二级子目录下的源文件
ROOT_DIR2 = src_fusion/DspLib
SOURCES += $(foreach subdir,${ROOT_DIR2}, $(wildcard ${ROOT_DIR}/${subdir}/*.c))
# 获取三级子目录下的源文件
ROOT_DIR3 = BSW/OS/Kernel
SOURCES += $(foreach subdir,${ROOT_DIR3}, $(wildcard ${ROOT_DIR}/${subdir}/*.c))
# 指定目标生成位置
TARGET_DIR = build
TARGET_FILE = ${TARGET_DIR}/${TARGET_NAME}
# ################################################################
# # 编译生成目标文件、库文件/执行文件
# ################################################################
all: build_dir ${TARGET_FILE}
# 生成目标目录
build_dir:
@mkdir -pv ${TARGET_DIR}
# 生成目标文件
${TARGET_FILE}: ${SOURCES}
${CXX} -o $@ $^
# ################################################################
# # 伪目标/自定义函数
# ################################################################
.PHONY:clean
clean:
@rm -rf ${TARGET_DIR} ${TARGET_DIR}/${TARGET_FILE}