C++项目Makefile配置求助:指定目标与输出文件路径
解决你的Makefile执行make直接clean的问题
我仔细看了你的Makefile,导致执行make直接跑clean的原因主要有两个,顺便还发现了一个拼写小错误,一起给你修正:
核心问题分析
- 缺少默认目标:Make工具默认会执行Makefile里的第一个显式目标,你的Makefile里第一个显式目标就是
clean,所以一跑make就直接触发清理操作了。 - 拼写错误:
DEPS定义里的IND_DIR是笔误,应该是INC_DIR,不然找不到头文件依赖,后续编译也会出问题。
修正后的完整Makefile
CC = c++ INC_DIR = ./include SRC_DIR = ./src BUILD_DIR = ./build BIN_DIR = ./bin TARGET = $(BIN_DIR)/Output.exe # 编译选项 CPPFLAGS = -Wall -Wfatal-errors -std=c++11 INC_FLAGS = -I $(INC_DIR) -I $(SRC_DIR) FLAGS = $(INC_FLAGS) $(CPPFLAGS) # 查找所有源文件和头文件 SRCS = $(shell find $(SRC_DIR) -name "*.cpp") DEPS = $(shell find $(INC_DIR) -name "*.hpp") # 把src下的.cpp文件对应到build目录下的.o文件 OBJS = $(patsubst $(SRC_DIR)/%.cpp, $(BUILD_DIR)/%.o, $(SRCS)) # 默认目标:编译生成最终可执行文件 all: $(TARGET) # 生成可执行文件:依赖所有目标文件 $(TARGET): $(OBJS) @mkdir -p $(BIN_DIR) # 确保bin目录存在,避免编译报错 $(CC) -o $@ $^ $(FLAGS) # 生成单个目标文件:处理每个cpp到对应build子目录的o文件 $(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp $(DEPS) @mkdir -p $(dir $@) # 如果src有子目录,自动创建对应build子目录 $(CC) -c -o $@ $< $(FLAGS) # 清理规则:删除所有目标文件和可执行文件 .PHONY: clean clean: rm -rf $(BUILD_DIR)/* $(TARGET)
关键修改说明
- 新增了
all作为默认目标,依赖最终的Output.exe,这样执行make时会优先编译生成可执行文件。 - 修正了
DEPS里的拼写错误,确保头文件依赖能正确识别。 - 用
patsubst更清晰地转换源文件到目标文件的路径,比原来的%替换逻辑更直观。 - 增加了
mkdir -p命令,自动创建build和bin目录(包括子目录),避免因为目录不存在导致编译失败。 - 扩展了
clean规则,彻底删除build下的所有文件和bin里的Output.exe,符合你的需求。
内容的提问来源于stack exchange,提问作者NotSure
相关产品推荐
相关产品推荐

