多层级makefile
多层级makefile
当项目变大之后,需要多层级的makefile来编译,每个makefile的具体功能实现参考单源文件目录makefile。然后再在顶层目录写一个总的makefile来实现编译逻辑就行。
这里假设存在main
模块和libdevcore
模块。
顶层makefile
# 项目根目录
TOP_DIR:=$(patsubst %/, %, $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
export TOP_DIR
# 各项目录
BUILD_DIR:=$(TOP_DIR)/build
BIN_DIR:=$(BUILD_DIR)/bin
export BUILD_DIR
#编译器
CXX:=g++
CXXFLAGS:=-std=c++11 -Wall -Wextra -Og -g
INCS:=-I $(TOP_DIR)
MACROS:=
export CXX CXXFLAGS INCS MACROS
# 链接器
LD:=g++
LDFLAGS:=
LIBS:=
# 各个模块
MODULES:=libmain libdevcore
# 各个模块对应的库
MODULE_LIBS:=$(BUILD_DIR)/libmain/lib/libmain.a\
$(BUILD_DIR)/libdevcore/lib/libdevcore.a
# 最终目标文件
TARGET:=$(BIN_DIR)/hello
# 默认最终目标
.PHONY:all
all:$(TARGET)
# 最终目标依赖关系
$(TARGET):FORCE | $(BIN_DIR)
@for n in $(MODULES); do make -s -f $(TOP_DIR)/$$n/makefile MODULE=$$n || exit "$$?"; done
@echo -e "\e[32m""Linking executable $(TARGET)""\e[0m"
@$(LD) $(LDFLAGS) -o $@ $(MODULE_LIBS) $(LIBS)
# 若没有bin目录则自动生成
$(BIN_DIR):
@mkdir -p $@
# 强制执行命令
.PHONY:FORCE
FORCE:
# make clean直接删除整个build目录
.PHONY:clean
clean:
@rm -rf $(BUILD_DIR)
各模块makefile
# 各项目录
LIB_DIR:=$(BUILD_DIR)/$(MODULE)/lib
DEP_DIR:=$(BUILD_DIR)/$(MODULE)/.dep
OBJ_DIR:=$(BUILD_DIR)/$(MODULE)/obj
SRC_DIR:=$(TOP_DIR)/$(MODULE)
# 源文件以及中间目标文件和依赖文件
SRCS:=$(notdir $(wildcard $(SRC_DIR)/*.cpp))
OBJS:=$(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(SRCS)))
DEPS:=$(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d,a $(SRCS)))
# 自动生成头文件依赖选项
DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
# 最终目标文件
TARGET:=$(LIB_DIR)/$(MODULE).a
# 默认最终目标
.PHONY:all
all:$(TARGET)
# 生成最终目标
$(TARGET):$(OBJS) | $(LIB_DIR)
@echo -e "\e[32m""Linking static library $(TARGET)""\e[0m"
@ar -rc $@ $^
# 若没有lib目录则自动生成
$(LIB_DIR):
@mkdir -p $@
# 生成中间目标文件
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR)
@echo -e "\e[33m""Building object $@""\e[0m"
@$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(MACROS) -o $@ $<
# 若没有obj目录则自动生成
$(OBJ_DIR):
@mkdir -p $@
# 若没有.dep目录则自动生成
$(DEP_DIR):
@mkdir -p $@
# 依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错
$(DEPS):
# 引入中间目标文件头文件依赖关系
include $(wildcard $(DEPS))
# 直接删除组件build目录
.PHONY:clean
clean:
@rm -rf $(BUILD_DIR)/$(MODULE)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)