makefile的10个关键知识点

linux程序开发会使用GNU Make来构建和管理整个工程,Makefile 文件描述了整个工程的编译、连接等规则,执行make命令就是实现自动化编译链接的过程。

一、编译链接

编译: 将源文件(.c/.s)生成目标文件(.o)
链接: 将目标文件和其依赖的静态库生成可执行文件
makefile的10个关键知识点_第1张图片
二、makefile常用语法要点
1. 规则语法
target ...: prerequisites ...
command
...   
>target:
目标,多种形式:目标文件、可执行文件、标签。
>prereiquisites:
target依赖的文件或目标
>command:
命令
2. 运行过程
1)make寻找当前目录下的Makefile文件。
2)寻找文件内的第一个target。
3)如果target不存在或者target的依赖文件比target更新,则将执行target后定义的command。
4)在执行target后定义的command前,同样需要检查target依赖的文件是否存在以及该文件的依赖文件是否更新。
make会一层层的寻找依赖性,直到最后生成target。
3. 伪目标:
>定义:
“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。
>标记
为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”
>典型伪目标
all、clean
4. 变量:
>变量命名
包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)。变量是大小写敏感。
>定义变量
objects = a.o b.o
>使用变量
 $(objects )、 $ objects 、${objects }
>追加变量
 objects  += c.o
5. 条件判断:ifeq
示例
ifeq ($(ENDIAN),EL)
OFORMAT = -EL
else
OFORMAT = -EB
endif
6. 使用函数:
>函数调用方法
$(<function> <arguments>)
<function>是函数名。<arguments>是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。
例如:$(findstring bcd,abcdef)
7. 引用文件:
>引用方法
include filename
>示例
include $(SDKINC)/sdk.xn
8. 隐含规则:
>定义模式规则
使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有“%”字符。“%”的意思是表示一个或多个任意字符。在依赖目标中同样可以使用“%”,只是依赖目标中的“%”的取值,取决于其目标。
>示例
$(OBJ_C) : %.o : %.c
$(CC) $(CC_OPTS) -c $< -o $@
$(OBJ_S) : %.o : %.S
$(CC) $(CC_OPTS_A) -c $< -o $@
>自动化变量
$<:依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。
$@:目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
9. 注释方式:
Makefile中只有行注释,其注释是用“#”字符
注意:Makefile中的命令必须以TAB键开始
10.Make运行:
>指定Makefile
Make默认会在当前目录下寻找Makefile/makefile。
也可以自定义Makefile名字,例如:Makefile_ko。
使用时需指定文件名make –f Mkaefile_ko
>指定target
make all、make test
>Make的参数
-C:进子目录编译,例如:Make –C ./cfg





你可能感兴趣的:(linux,makefile,gnu,linker,工具链)