我是makefile字段中的新手,但是尝试编写有两种模式的makefile:普通模式make
输出名为bingo
的可执行文件,具体取决于某些文件和模式{{1}输出名为make debug
的可执行文件,该文件应使用调试选项进行编译。我尝试使用目标变量,结果如下:
bingo.debug
看起来PROGRAM = bingo
SUFIX = .debug
CC = gcc
CFLAGS = -Wall -O2
DEBUG = -g -D DEBUG
all: $(PROGRAM)
debug: CFLAGS += $(DEBUG)
debug: PROGRAM += $(SUFIX)
debug: all
file1.o: file1.c file1.h
$(CC) -c $(CFLAGS) -o $@ $<
file2.o: file2.c file2.h
$(CC) -c $(CFLAGS) -o $@ $<
$(PROGRAM).o: $(PROGRAM).c
$(CC) -c $(CFLAGS) -o $@ $<
$(PROGRAM): file1.o file2.o ($PROGRAM).o
$(CC) -o $@ $^
.PHONY: all clean
clean:
rm -rf $(PROGRAM) *.o
正确编译带有调试标志的文件,但它不会更改文件名(即两种模式都输出相同的make debug
文件)。任何帮助很多appriciated!
答案 0 :(得分:0)
您无法在目标中使用特定于目标的变量。 The documentation非常明确,它们仅在食谱中可用。
一般来说,以这种方式做事是有问题的,因为make不知道哪些对象是用调试构建的,哪些不是。如果您忘记完全清理和/或以错误的方式运行make
,那么您将获得不同目标文件的混合:一些使用调试编译而另一些则不编译。
相反,您应该将调试对象文件放在与非调试对象文件不同的目录中,这样您就不用担心了。