如何使用Makefile将.o文件生成到与源文件不同的目录
修改后的Makefile完整内容
CXX = g++ INCL_DIR = src/include LIB_DIR = src/lib # 新增生成文件存放目录配置 OBJ_DIR = obj BIN_DIR = bin SRC = $(wildcard *.cpp) # 修改OBJ文件路径映射,全部输出到OBJ_DIR目录下 OBJ = $(patsubst %.cpp, $(OBJ_DIR)/%.o, $(SRC)) # 最终生成的可执行文件路径 TARGET = $(BIN_DIR)/main all: $(TARGET) # 模式规则:编译每个cpp文件生成对应obj目录下的o文件 $(OBJ_DIR)/%.o: %.cpp @mkdir -p $(OBJ_DIR) $(CXX) -I $(INCL_DIR) -c $< -o $@ # 链接规则:将所有o文件链接生成指定目录下的可执行文件 $(TARGET): $(OBJ) @mkdir -p $(BIN_DIR) $(CXX) $(OBJ) -o $@ -L$(LIB_DIR) -lsfml-graphics -lsfml-window -lsfml-system # 可选:添加clean规则快速清理生成文件 .PHONY: clean clean: rm -rf $(OBJ_DIR) $(BIN_DIR)
关键改动说明
- 新增了
OBJ_DIR和BIN_DIR变量,分别指定.o文件和可执行文件的存放路径,你可以根据需要修改成自己想要的目录 - 用
patsubst函数替换了原有的后缀替换逻辑,把所有.o文件的路径都映射到了OBJ_DIR目录下 - 替换了原来统一编译所有源文件的写法,改用模式规则逐个编译源文件,每次编译前用
mkdir -p确保存放目录存在,避免首次编译找不到目录报错 - 链接阶段直接输出可执行文件到指定的
BIN_DIR目录,同样提前创建目录 - 额外添加了
clean伪目标,执行make clean就可以一键删除所有生成的目录和文件,方便重新全量编译
如果你不需要单独存放可执行文件,只需要把
BIN_DIR改成.,就可以让.exe文件生成在Makefile同级目录下,仅把.o文件存放到obj目录。
内容的提问来源于stack exchange,提问作者Enigmo Thread
相关产品推荐
相关产品推荐

