在我的C ++项目中,我有一个约定,每当定义宏DEBUG
时,调试printf-esque语句就会编译成可执行文件。
为了表明我是否希望将这些编译成可执行文件,我通常会使用-D
宏选项将宏名称传递给gcc。所以,在Makefile
我(目前)有:
CXXFLAGS += -g -I ../ -Wall -Werror -DDEBUG
但是,这不是很灵活;如果我不想在我的最终程序中使用调试语句,我必须修改Makefile以删除-DDEBUG。
有没有办法修改Makefile
,以便我可以通过传入另一个目标名称或命令行开关来有条件地选择是否在编译时在CXXFLAGS中使用-D进行编译?不确定我是怎么做的。
答案 0 :(得分:4)
您可以根据makefile中的目标有条件地定义其他变量。
all: target
debug: target
debug: DEBUG=PLOP
target:
@echo "HI $(DEBUG)"
现在:
> make
HI
>
> make debug
HI PLOP
>
答案 1 :(得分:2)
$ cat Makefile
CXXFLAGS += $(CLIFLAGS)
maintarget:
echo $(CXXFLAGS)
$ make CLIFLAGS=-DDEBUG
echo -DDEBUG
-DDEBUG
$
答案 2 :(得分:1)
答案 3 :(得分:0)
在冥想make documentation后,我尝试将其放入我的Makefile:
ifneq(,$(findstring d,$(MAKEFLAGS)))
CXXFLAGS += <... all normal options ...> -DDEBUG
else
CXXFLAGS += <... all normal options ...>
endif
然后,当您运行make -d
时,-DDEBUG
已设置。
现在,请注意,它有效,但我必须使用通常接受的普通标志(你不能自己制作)。使用-d还会向屏幕喷出(无害的)详细的make级调试语句。我真的不想要;它掩盖了编译错误。但它确实有效。
我希望有人能提出更好的主意。