修改GNU Makefile适配调整后的项目目录结构并输出到指定文件夹
Makefile 修改方案
以下是修改完成的完整Makefile,可直接满足你的两个需求:
SOURCE_DIR = src HEADER_DIR = $(SOURCE_DIR)/include BUILD_DIR = build LIB_DIR = lib BIN_DIR = bin # 给所有目标文件加build目录前缀 OBJS = $(addprefix $(BUILD_DIR)/, foo.o foobar.o foofoobar.o barbar.o barfoo.o barbarfoo.o) MAIN_OBJ = $(BUILD_DIR)/main.o # 统一加头文件搜索路径、自动生成依赖的参数 CFLAGS += -I$(HEADER_DIR) -MMD -MP WARNINGS += -Wall -Wextra # 可根据需要调整警告等级 all: dir release dir: test -d $(HEADER_DIR) || mkdir -p $(HEADER_DIR) test -d $(BUILD_DIR) || mkdir -p $(BUILD_DIR) test -d $(LIB_DIR) || mkdir -p $(LIB_DIR) test -d $(BIN_DIR) || mkdir -p $(BIN_DIR) debug : CC = gcc debug : CFLAGS += -std=c99 -O0 -g debug : LDLIBS = -lm debug : project release : CC = gcc release : CFLAGS += -std=c99 -O3 -fno-strict-aliasing release : LDLIBS = -lm release : project debug_cpp : CC = g++ debug_cpp : CFLAGS += -x c++ -std=c++11 -O0 -g ifeq ($(PLATFORM),Darwin) # macOS debug_cpp : WARNINGS += -Wcast-qual endif debug_cpp : LDLIBS = -lstdc++ debug_cpp : project release_cpp : CC = g++ release_cpp : CFLAGS += -x c++ -std=c++11 -O3 -fno-strict-aliasing ifeq ($(PLATFORM),Darwin) # macOS release_cpp : WARNINGS += -Wcast-qual endif release_cpp : LDLIBS = -lstdc++ release_cpp : project # 替换原有隐式规则,明确生成到build目录,且依赖目录先创建 $(BUILD_DIR)/%.o : $(SOURCE_DIR)/%.c | dir $(CC) -c $(CFLAGS) $(WARNINGS) $< -o $@ project : $(MAIN_OBJ) $(LIB_DIR)/libproject.a $(CC) -o $(BIN_DIR)/project $< -L$(LIB_DIR) -lproject $(LDLIBS) $(LIB_DIR)/libproject.a : $(OBJS) rm -f $@ ar cq $@ $^ clean : -rm -rf $(BUILD_DIR)/* -rm -f $(BIN_DIR)/project -rm -f $(LIB_DIR)/libproject.a .PHONY : all project clean debug release debug_cpp release_cpp # 导入自动生成的依赖文件,无需手动维护gcc -MM生成的规则 -include $(OBJS:.o=.d) $(MAIN_OBJ:.o=.d)
核心修改说明
- 所有编译中间文件(
.o目标文件、.d依赖文件)全部输出到$(BUILD_DIR)目录,符合需求的中间文件存放要求 - 可执行文件直接生成到
$(BIN_DIR),静态库文件直接生成到$(LIB_DIR),无需额外移动 - 新增自动生成依赖的逻辑,不需要再手动执行
gcc -MM更新依赖规则,编译时会自动处理头文件变更的增量编译 - 所有规则下的命令行开头必须使用
Tab缩进,不能替换为空格,否则Make会报错
内容的提问来源于stack exchange,提问作者Homunculus Reticulli
相关产品推荐
相关产品推荐

