如何通过Makefile在指定文件夹生成.o文件?
问题
我需要将编译生成的.o文件保存到指定文件夹中,但当前这些文件会生成在main.cpp所在的同一目录下。
原Makefile
cversion = -std=c++23 true = 1 false = 0 notfalse = 1 ClassPath = ./test dotO = ./dotO output.exe: message.o main.o g++ $(cversion) main.o message.o -o output main.o: main.cpp g++ $(cversion) -c main.cpp message.o: message.cpp g++ $(cversion) -c message.cpp clean: @cls @echo Errasing... @del *.o @del output.exe @echo Files have been erased.
原message.h
int messageBox(int x, int y);
原message.cpp
int messageBox(int x, int y){ return x+y; }
原main.cpp
#include <iostream> #include "message.h" int main(){ std::cout << messageBox(10, 50) << std::endl; }
环境信息
- 操作系统:Windows
- 编辑器:VScode
- 编译工具:mingw64
解决方案
你已经定义了dotO = ./dotO作为.o文件的目标目录,只需修改Makefile的编译、链接规则及clean命令即可:
修改后的Makefile
cversion = -std=c++23 true = 1 false = 0 notfalse = 1 ClassPath = ./test dotO = ./dotO # 编译前自动创建目标目录,避免因目录不存在报错 $(shell if not exist $(dotO) mkdir $(dotO)) output.exe: $(dotO)/message.o $(dotO)/main.o g++ $(cversion) $(dotO)/main.o $(dotO)/message.o -o output $(dotO)/main.o: main.cpp g++ $(cversion) -c main.cpp -o $(dotO)/$@ $(dotO)/message.o: message.cpp g++ $(cversion) -c message.cpp -o $(dotO)/$@ clean: @cls @echo 正在删除文件... @del $(dotO)\*.o @del output.exe @echo 文件已删除完成。
修改说明
- 自动创建目标目录:通过
$(shell if not exist $(dotO) mkdir $(dotO))确保编译前dotO目录存在,避免编译报错。 - 指定.o文件输出路径:编译规则中添加
-o $(dotO)/$@,将生成的.o文件直接输出到指定目录,$@代表当前目标文件名(如main.o、message.o)。 - 更新链接依赖路径:将
output.exe的依赖从message.o main.o改为$(dotO)/message.o $(dotO)/main.o,让make到指定目录查找.o文件。 - 修正clean命令:把删除.o文件的命令改为
del $(dotO)\*.o,确保删除指定目录下的.o文件,而非当前目录。
验证步骤
- 在VScode终端执行
make命令,编译完成后查看dotO目录,main.o和message.o会生成在此目录下。 - 执行
make clean,即可删除dotO目录下的.o文件及output.exe。
内容的提问来源于stack exchange,提问作者Meniev
相关产品推荐
相关产品推荐

