在 Makefile 中,与编译器相关的语法通常用于定义编译规则和链接规则,以及设置编译器选项等。
编译器相关的 Makefile 语法
- 定义变量
CFLAGS = -Wall -O2
- 编译规则
%.o: %.c $(CC) $(CFLAGS) -c $< -o $@
- 链接规则
program: file1.o file2.o $(CC) $^ -o $@
- 使用编译器变量和选项
$(CC) $(CFLAGS) -c source.c -o object.o
- 指定头文件搜索路径
CPPFLAGS = -I/path/to/include
- 指定库文件搜索路径
LDFLAGS = -L/path/to/lib LDLIBS = -lmylib
- 指定交叉编译器
CROSS_COMPILE=aarch64-linux-gnu-
CROSS_COMPILE=$CROSS_COMPILETOOL
- 指定生成目录
O=build
- 指定架构
ARCH=arm64
CCFLAGS和CFLAGS的概念
在 Makefile 中,CCFLAGS 和 CFLAGS 变量都可以用来指定编译器选项。它们的区别在于用途和命名习惯。- CFLAGS:通常用来指定 C 语言的编译器选项,如警告级别、优化级别等。它是一个常见的约定俗成的变量名,用于存储与 C 语言编译相关的选项。
- CCFLAGS:是一个更通用的变量名,可以用来指定任何编译器(包括 C、C++、Objective-C 等)的选项。它不限于特定语言,可以包含更广泛的编译器选项。
CFLAGS可选项
CFLAGS 是在 Makefile 中用来存储 C 编译器选项的变量,可以包含一系列用于编译 C 代码的选项。以下是一些常见的 C 编译器选项,可以添加到 CFLAGS 中:- -Wall:启用大多数警告信息。
- -Werror:将警告视为错误。
- -g:生成调试信息。
- -O2 或 -O3:开启优化级别 2 或 3。
- -std=c11:指定使用 C11 标准进行编译。
- -I:添加头文件搜索路径。
- -L:添加库文件搜索路径。
- -l:链接指定的库。
- -D:定义预处理宏。
- -c:只编译不链接,生成目标文件。
- -o :指定输出文件名。
CCFLAGS-y
CCFLAGS-y 是一个自定义的编译器选项,它在 Makefile 中可能被用来指示特定的条件编译。 在 Makefile 中,CCFLAGS-y 的约定通常是用于条件编译的情况。条件编译可以根据某些条件来选择性地包含或排除代码的一部分。 CCFLAGS-y 可能会被用作一个标志,用于启用或禁用特定的编译器选项。 具体来说,当某个条件满足时,CCFLAGS-y 变量中的选项会被添加到编译器选项中。而当该条件不满足时,这些选项则不会被包含在编译器选项中。 举个例子:ccflags-y += -D__CCFLAGS_TEST__ __CCFLAGS_TEST__:=1 export __CCFLAGS_TEST__ // 导出了__CCFLAGS_TEST__宏,使得在 Makefile 中定义的宏可以在子进程中使用通过以上的代码,编译过程中会将 __CCFLAGS_TEST__宏定义为1,从而在代码中可以根据这个宏的取值进行条件编译,实现不同的编译选项和行为。
ccflags-$(CONFIG_DEBUG_TEST) := -DDEBUG
在这个示例中,ccflags-$(CONFIG_DEBUG_TEST) := -DDEBUG 的含义是根据名为 CONFIG_DEBUG_TEST 的配置选项来设置编译器选项。- 如果 CONFIG_DEBUG_TEST 配置选项被定义了(即非空),那么 ccflags-$(CONFIG_DEBUG_TEST) 将被设置为 -DDEBUG。-DDEBUG 是一个 C 编译器选项,用于在预处理阶段定义名为 DEBUG 的宏。
- 如果 CONFIG_DEBUG_TEST 配置选项未定义或为空,那么 ccflags-$(CONFIG_DEBUG_TEST) 将为空,不会设置任何额外的编译器选项。