使用调试选项创建makefile

6

我创建了一个(非常简单的)makefile:

DEBUG = -DDEBUG

main: main.c add.c
   gcc $(DEBUG) main.c add.c -o main -lm

我想要(但不知道如何实现)的是创建一个Makefile,这样如果用户输入make debug,则代码将使用debug选项编译,但仅输入make时将忽略debug。如何最好地实现这一点?

3个回答

9
您可能正在寻找类似以下的内容:
main: main.c add.c
   gcc $(DEBUG) main.c add.c -o main -lm

debug: DEBUG = -DDEBUG

debug: main

谢谢,这有效。唯一的问题是,如果我写'make',然后是'make debug'或者反过来,它仍然编译到我第一次写的'make'。是否可能创建makefile,使得每次重新编译时都使用我给出的选项? - user16655
不,它不会在你运行第一个“make”时编译。它只是检查你的源文件是否比可执行文件更新。如果没有,它将不会执行任何操作。因此,除非在两次运行之间更新源文件,否则你运行的第二个“make”将不会做任何事情。但是,如果你想让“make debug”始终重新编译,只需添加“.PHONY: debug”。 - downhillFromHere
添加.PHONY: debug是没有帮助的。这只会使得debug目标本身成为伪目标,而该目标并没有任何命令。你需要编写一个“clean”规则,然后在两次调用make之间运行make clean。或者,修改你的Makefile文件,使得调试版本被创建在不同的目录中。 - MadScientist
@MadScientist 感谢指出这个问题。显然,这是因为我忘记恢复的更改导致在我测试时它可以工作。 - downhillFromHere
因此,您可以在第一条规则中执行 main debug: main.c add.c,而不是将 debug 设置为虚假的,以确保 make debug 始终重新编译。 - downhillFromHere

1
This may be late, ...
基本思想是在子目录中构建所有对象,比如./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

0
我想出了这个解决方案,它依赖于bash变量替换
Makefile:
main: main.c add.c
    ${CC} `echo $${DEBUG+-DDEBUG}` main.c add.c -o main -lm

当环境变量 DEBUG 被定义为任何值(即使为空),此 makefile 将会向编译器注入有用的 -DDEBUG。因此,调用看起来像这样:

DEBUG=1 make main

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接