自定义源/输出目录的Makefile配置需求及现有问题
编写符合目录规范的Makefile
需求说明
需要创建可正常编译的Makefile,满足以下目录整洁要求:
- 最终二进制文件输出到项目根目录,或可选的
./bin目录 - 所有源文件(
*.cpp、*.h)统一存放在./src目录 - Makefile置于项目根目录
- 所有目标文件(
*.o)输出到./src目录内对应源文件的同级路径
当前问题
现有Makefile只能将目标文件输出到项目根目录,代码如下:
CXXFLAGS += -std=c++11 OUTPUT := main $(OUTPUT): main.o util.o $(CXX) $(CXXFLAGS) -o $(OUTPUT) main.o util.o main.o: main.cpp ./src/util.h $(CXX) $(CXXFLAGS) -c main.cpp util.o: ./src/util.h ./src/util.cpp $(CXX) $(CXXFLAGS) -c ./src/util.cpp
解决方案
以下是修改后的Makefile,完全满足上述需求:
# 编译器与编译选项 CXX := g++ CXXFLAGS += -std=c++11 -Wall # 二进制输出路径:可选择根目录或./bin目录 # 根目录版本 OUTPUT := main # ./bin目录版本(取消注释下方一行,注释上方一行即可切换) # OUTPUT := ./bin/main # 自动扫描src目录下所有.cpp源文件 SRCS := $(wildcard src/*.cpp) # 生成对应目标文件路径(将.cpp替换为.o,保留在src目录内) OBJS := $(SRCS:.cpp=.o) # 主目标:生成二进制文件 $(OUTPUT): $(OBJS) # 若输出目录为bin,自动创建目录(避免目录不存在报错) @mkdir -p $(dir $(OUTPUT)) $(CXX) $(CXXFLAGS) -o $@ $^ # 模式规则:统一编译src下的.cpp文件到同级.o文件 src/%.o: src/%.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ # 清理规则:删除编译产物 clean: rm -f $(OBJS) $(OUTPUT)
关键说明
- 用
wildcard自动扫描src目录下所有源文件,无需手动逐个添加 - 通过
$(SRCS:.cpp=.o)自动映射目标文件路径,确保.o文件与源文件同目录 - 加入
mkdir -p确保选择./bin作为输出目录时,目录会自动创建 - 模式规则
src/%.o: src/%.cpp统一处理所有源文件编译,避免重复编写单个规则 - 新增
clean规则,方便一键清理编译产物
内容的提问来源于stack exchange,提问作者Kungfunk
相关产品推荐
相关产品推荐

