我创建了一个(非常简单的)makefile:
DEBUG = -DDEBUG
main: main.c add.c
gcc $(DEBUG) main.c add.c -o main -lm
我想要(但不知道如何实现)的是创建一个Makefile,这样如果用户输入
make debug
,则代码将使用debug选项编译,但仅输入make
时将忽略debug。如何最好地实现这一点?main: main.c add.c
gcc $(DEBUG) main.c add.c -o main -lm
debug: DEBUG = -DDEBUG
debug: main
.PHONY: debug
是没有帮助的。这只会使得debug
目标本身成为伪目标,而该目标并没有任何命令。你需要编写一个“clean”规则,然后在两次调用make
之间运行make clean
。或者,修改你的Makefile文件,使得调试版本被创建在不同的目录中。 - MadScientistmain debug: main.c add.c
,而不是将 debug
设置为虚假的,以确保 make debug
始终重新编译。 - downhillFromHere./build
。
我们使用make
编译时,在./build中创建一个发布文件,使用make debug
创建一个调试文件。因此,如果在make debug
时存在发布文件,则删除./build中的所有内容,然后进行构建。all: $(BD)/release $(bin1) $(bin2)
debug: CFLAGS += -g -DDEBUG=1
debug: CXXFLAGS += -g -DDEBUG=1
debug: $(BD)/debug $(bin1) $(bin2)
$(BD)/%.o: %.c Makefile # changes in Makefile will cause a rebuild
@mkdir -p $(BD)
$(CC) $(CFLAGS) -c -o $@ $<
$(BD)/%.o: %.cpp Makefile
@mkdir -p $(BD)
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(BD)/release:
@if [ -e $(BD)/debug ]; then rm -rf $(BD); fi
@mkdir -p $(BD)
@touch $(BD)/release
$(BD)/debug:
@if [ -e $(BD)/release ]; then rm -rf $(BD); fi
@mkdir -p $(BD)
@touch $(BD)/debug
main: main.c add.c
${CC} `echo $${DEBUG+-DDEBUG}` main.c add.c -o main -lm
-DDEBUG
。因此,调用看起来像这样:
DEBUG=1 make main