Makefile---make命令中定义宏方法 0 Preface/Foreword在makefile或者make命令行中定义的宏通常被称为变量。要让定义的这个宏变量的值被工程中的所有源文件即编译器使用核心思路将该变量作为编译选项比如-D定义预处理宏或-I指定头文件路径等传递给编译器命令。1 宏定义1.1 在makefile中定义并传递 推荐Makefile文件.PHONY: clean .PHONY: run MY_MACRO 1 DEBUG_MODE 1 CFLAGS -DMY_MACRO$(MY_MACRO) CFLAGS -DDEBUG_MODE$(DEBUG_MODE) CFLAGS -DSUB$(SUB) CFLAGS -DPLUS$(PLUS) main: $(wildcard *.c) gcc $(CFLAGS) $ -o $ chmod 777 * clean: echo run clean process.... rm main run: ./mainC源文件#include stdio.h #include strings.h #include stdlib.h int main (void) { int a 30; int b 20; int sum 0; printf(a %d\n, a); printf(b %d\n, b); #ifdef PLUS printf(\n); sum a b; printf(PLUS %d\n, PLUS); printf(ab %d\n, sum); #endif #ifdef SUB printf(\n); printf(SUB %d\n, SUB); sum a - b; printf(a-b %d\n, sum); #endif return 0; }编译和运行1.2 通过make命令行传递Makefile文件.PHONY: clean .PHONY: run STR ? string_one ifdef DEBUG #STR ? string_two STR string_two CFLAGS -DDEBUG endif #CFLAGS -DSTR$(STR) #CFLAGS -DSTR$(STR) CFLAGS -DSTR\$(STR)\ main: $(wildcard *.c) gcc $(CFLAGS) $ -o $ chmod 777 * clean: echo run clean process.... rm main run: ./mainC源文件#include stdio.h #include strings.h #include stdlib.h #define NAME OSM #define CITY HongKong int main (void) { printf(\n); printf(Name: %s\n, NAME); printf(City: %s\n,CITY); #ifdef DEBUG printf(STR: %s\n, STR); #endif return 0; }编译和运行1.3 导出为环境变量多用于构建脚本较少用于编译器宏宏在构建过程中脚本需要的环境变量可以使用export。但需要注意普通的export不会自动变成C/C的#define宏除非在makefile中显式地将其转换为-D选项。1.4 The Best Practice使宏可以被所有源文件使用的步骤如下在Makefile中定义变量 MY_VAR value将该变量加入编译标志CFLAGS -DMY_VAR$(MY_VALUE)确保编译规则使用了 $(CFLAGS) : gcc $(CFLAGS) -c file.c -o file.o