为何两个Makefile编译的C++可执行均输出DEBUG内容?如何修正?
问题分析
核心问题是两个Makefile共用了同一个main.o目标文件。先执行make -f debug.mak时,会生成带有-DDEBUG编译选项的main.o;之后执行make -f release.mak时,Make检测到main.o的修改时间晚于main.cpp,会跳过编译步骤,直接用已有的带调试宏的main.o链接生成main可执行文件,导致两个程序都输出调试信息。
解决方法
方法1:为debug和release版本生成独立的目标文件
分别给两个版本的目标文件命名,避免文件覆盖。修改后的Makefile如下:
release.mak
main: main.o g++ -o main main.o main.o: main.cpp g++ -pedantic-errors -ansi -Wall -c main.cpp clean: rm -f main main.o
debug.mak
main_debug: main_debug.o g++ -o main_debug main_debug.o main_debug.o: main.cpp g++ -DDEBUG -pedantic-errors -ansi -Wall -c main.cpp -o main_debug.o clean: rm -f main_debug main_debug.o
方法2:编译前强制清理旧目标文件
在执行编译命令前先清理掉旧的main.o,确保每次编译都重新生成目标文件:
- 执行debug编译:
make -f debug.mak clean && make -f debug.mak - 执行release编译:
make -f release.mak clean && make -f release.mak
也可以在Makefile中添加all目标,自动先清理再编译,比如修改release.mak:
all: clean main main: main.o g++ -o main main.o main.o: main.cpp g++ -pedantic-errors -ansi -Wall -c main.cpp clean: rm -f main main.o
执行时用make -f release.mak all即可。
方法3:使用统一的Makefile区分构建模式
更推荐的方式是写一个支持debug/release模式的统一Makefile,通过变量控制编译选项:
CC = g++ CFLAGS = -pedantic-errors -ansi -Wall TARGET = main ifeq ($(MODE), debug) CFLAGS += -DDEBUG TARGET = main_debug endif all: $(TARGET) $(TARGET): main.o $(CC) -o $(TARGET) main.o main.o: main.cpp $(CC) $(CFLAGS) -c main.cpp clean: rm -f main main_debug main.o
- 编译release版本:
make MODE=release - 编译debug版本:
make MODE=debug
内容的提问来源于stack exchange,提问作者hello
相关产品推荐
相关产品推荐

