makefile的10个关键知识点

    xiaoxiao2021-04-14  98

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

    一、编译链接

     

    编译: 将源文件(.c/.s)生成目标文件(.o) 链接: 将目标文件和其依赖的静态库生成可执行文件 二、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
    转载请注明原文地址: https://ju.6miu.com/read-670165.html

    最新回复(0)