首页 > 其他分享 >编译器有关的Makefile语法

编译器有关的Makefile语法

时间:2024-03-17 23:55:35浏览次数:26  
标签:选项 Makefile 语法 编译 编译器 CCFLAGS TEST

在 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 等)的选项。它不限于特定语言,可以包含更广泛的编译器选项。
实际上,CCFLAGS 变量在某些 Makefile 中可能被用作 C 编译器选项的别名。这样做的目的是为了与其他语言的编译器选项变量保持一致,或者为了方便将同一组选项同时应用于多个编译器。 总而言之,CFLAGS 更常见且特定于 C 语言的编译器选项,而 CCFLAGS 则更通用、更灵活,可以适用于其他编译器。  

CFLAGS可选项

CFLAGS 是在 Makefile 中用来存储 C 编译器选项的变量,可以包含一系列用于编译 C 代码的选项。以下是一些常见的 C 编译器选项,可以添加到 CFLAGS 中:
  • -Wall:启用大多数警告信息。
  • -Werror:将警告视为错误。
  • -g:生成调试信息。
  • -O2 或 -O3:开启优化级别 2 或 3。
  • -std=c11:指定使用 C11 标准进行编译。
  • -I:添加头文件搜索路径。
  • -L:添加库文件搜索路径。
  • -l:链接指定的库。
  • -D:定义预处理宏。
  • -c:只编译不链接,生成目标文件。
  • -o :指定输出文件名。
这些选项可以根据具体需求进行组合和调整,以满足不同的编译需求。通过合理设置 CFLAGS 变量,可以简化 Makefile 中的编译规则,并确保代码按照预期方式进行编译  

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) 将为空,不会设置任何额外的编译器选项。
还需要在Kconfig中添加CONFIG_DEBUG_TEST 的配置选项    

标签:选项,Makefile,语法,编译,编译器,CCFLAGS,TEST
From: https://www.cnblogs.com/lethe1203/p/18079443

相关文章

  • Makefile学习(二)
    参看文档:《跟我一起写Makefile》Makefile中常用的自动化变量:$@:表示规则中的目标文件名。$<:表示规则中的第一个依赖文件名。$^:表示规则中的所有依赖文件列表,以空格分隔并去重。$?:表示规则中所有比目标文件更新的依赖文件列表。$*:表示不包括扩展名的目标文件名。$(@D):表示......
  • aardio教程二) 进阶语法
    表(table)aardio中除了基础数据类型外,其他的复合对象都是table(例如类和名字空间等)。table可以用来存放aardio的任何对象,包括另一个table。在其他语言中的字典、列表、数组、集合映射等,在aardio中都使用table来实现。创建字典importconsole;vartab={a=123;......
  • Makefile学习(一)
    参看文档:《跟我一起写Makefile》Makefile的基本规则:target...:prerequisites...command......target也就是一个目标文件,可以是ObjectFile,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。prerequisites......
  • vim,gcc,gdb与Makefile的使用
    一、Linux编辑器-vim使用1.vim的基本概念vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下(1)正常/普通/命令模式(Normalmode)控制屏幕光标的移动,字符、字或行的删除,移动复制......
  • Python基础语法
    Python目录-基础语法注释数据类型数据类型准换字面量变量数据输出数据输入标识符运算符判断语句循环语句注释单行注释#以#号开头,#号和注释内容建议以一个空格隔开多行注释"""以三个双引号引起来三个双信号之中写注释内容"""数据类型Python中常用......
  • Python基本语法
    Python基本语法Python是一种简单易学、功能强大的编程语言,其基本语法涵盖了变量、数据类型、运算符等方面。本文将介绍Python中的基本语法要点,帮助初学者快速入门。变量在Python中,变量是用来存储数据的容器。定义变量时不需要指定数据类型,Python会根据赋给变量的值自动确......
  • 8.Python基本语法·注释——《跟老吕学Python编程》
    8.Python中的注释——《跟老吕学Python编程》Python基本语法Python注释单行注释老吕举栗1:老吕举栗2:老吕举栗3:多行注释老吕单双引号举栗:多行注释常见错误1多行注释常见错误1老吕想说一分钟让你记住Python注释怎么写注释的写作风格与规范来,大家再跟我背一遍Python注释......
  • 一篇文章带你掌握Flex 布局:语法、实例
    目录前言语法一、Flex布局是什么?二、基本概念三、容器的属性(应用在父元素上)1.**`flex-direction`**:2.**`flex-wrap`**:3.**`flex-flow`**:4.**`justify-content`**:5.**`align-items`**:6.**`align-content`**:四、项目的属性(应用在子元素上)1.**`order`**:2.**`flex-......
  • Python语法糖
    \(NumPy\)的\(nditer\)nditer是NumPy提供的一种多维迭代器,用于对多维数组进行迭代操作。它可以替代传统的嵌套循环,在处理多维数组时更加方便和高效。迭代器可以按照不同的顺序遍历数组的元素,也可以控制迭代器的访问方式和步长。在处理多维数组时,特别是需要对数组的每个元素进......
  • aardio教程一) 基础语法-下
    条件判断语句使用if、elseif和else来对变量或表达式进行判断io.open()//打开控制台vara=1if(a==1){io.print("if")}elseif(a==11){io.print("elseif")}else{io.print("else")}也可以使用select对变量或表达式进行判断,也就是JavaScript中的switch语......