场景:
一般程序都会有两个版本,针对出现问题需要定位的调试的版本和面向用户的发布的版本,这两个版本在代码级别上很大的区别在于是否把#ifdef DEBUG #endif编译进入二进制文件当中,而相对于makefile来说,就是在命令行里面加或者不加-D DEBUG的问题。例子: gcc -g -o main test_macro.c-D DEBUG 这个会把#ifdef和#endif之间的内容编译进去,如果这里面的内容是日志,错误信息的话,方便我们定位问题和解决问题。现在就会有两种方案去编译调试和发布版本, 一种是在makefile里面进行删除-D DEBUG 编译生成发布版本,增加-D DEBUG编译生成调试版本,这样会显得我们开发人员的智商有待提高;更好的一种方法是在makefile内部定义一个变量usedebug=0, 根据变量usedebug的值进行不同的编译命令, 然后再由make 命令在外部进行设置usedebug的值就可以生成不同的编译版本。
解决方案:
cc=gcc
useDebug=0
${warning useDebug ${useDebug}}
main:test_macro.c
ifeq ($(useDebug), 1)
$(cc) -g -o $@ $^ -D DEBUG
else
$(cc) -g -o $@ $^
endif
clean:
rm -rf main
执行命令 make useDebug=1; make useDebug=0; 就可以执行不同的编译命令,生成不同的版本了。
需要注意的是: make useDebug=1 等号两边不能有空格,否则会报错的。还有一个ifeq else endif控制语句前面都不需要tab键,在一行的开始处写就是,否则也会报错。