• Makefile 语法及使用笔记


    1、Makefile规则格式

    <目标> : <依赖文件集合>
    	命令 1
    	命令 2
    
    • 1
    • 2
    • 3

    示例:

    # -c : 编译生成同名目标文件(xx.o),不链接
    # -o : 链接生成可执行文件(target)
    target : main.o hello.o world.o
    	gcc -o target main.o hello.o world.o
    
    main.o: main.c
    	gcc -c main.c
    
    hello.o: hello.c
    	gcc -c hello.c
    
    world.o: world.c
    	gcc -c world.c
    
    clean:
    	rm *.o
    	rm abc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2、Makefile变量

    Makefile中的变量都是字符串,类似 C语言中的宏。

    变量相关符号:

    符号功能描述
    =赋值符变量的真实值取决于它所引用的变量的最后一次有效值。
    :=赋值符不会使用后面定义的变量,只能使用前面已经定义好的。
    ?=赋值符如果前面已经赋过值了,就使用前面赋的值;如果变量没有被赋值就使用当前定义的值。
    +=变量追加给之前已经定义好的变量添加一些变量。

    示例:

    OBJ  = main.o 
    OBJ  += hello.o 
    OBJ  += world.o
    
    • 1
    • 2
    • 3

    或者

    OBJ  = main.o hello.o world.o
    
    target : $(OBJ)
    	gcc -o target $(OBJ)
    
    main.o: main.c
    	gcc -c main.c
    
    hello.o: hello.c
    	gcc -c hello.c
    
    world.o: world.c
    	gcc -c world.c
    
    clean:
    	rm *.o
    	rm abc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3、Makefile模式规则

    % :表示长度任意的非空字符串。类似于通配符。

    # `%.o`:所有的以 `.o` 结尾的文件
    # `%.c`:所有的以 `.c` 结尾的文件
    # 当“ “%”出现在目标中的时候,目标中 “%”所代表的值决定了依赖中的 “%”值
    %.o: %.c
    	<命令>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4、Makefile自动化变量

    自动化变量描述
    $@规则中的目标集合,在模式规则中,如果有多个目标的话,“,“$@”表示匹配模式中定义的目标集合。
    $%当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。
    $<依赖文件集合中的第一个文件,如果依赖文件是以模式(即“ “%””)定义的,那么““$<”就是符合模式的一系列的文件集合。
    $?所有比目标新的依赖目标集合,以空格分开。
    $^所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,““$^”会去除重复的依赖文件,只保留一份。
    $+和““$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。
    $*这个变量表示目标模式中"%"及其之前的部分,如果目标 是 test/a.test.c,目标模式为 a.%.c,那么 “$*”就是 test/a.test。

    示例:

    OBJ = main.o hello.o world.o
    
    target : $(OBJ)
    	gcc -o target $(OBJ)
    
    # %.o 代表 main.o hello.o world.o
    # %.c 代表 main.c hello.c world.c
    # $< : 符合模式的一系列的依赖文件集合。即 `%.c` 代表的 main.c hello.c world.c
    %.o: %.c
    	gcc -c $<
    
    clean:
    	rm *.o
    	rm abc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    5、Makefile伪目标

    • 伪目标不代表真正的目标名,在执行 make命令的时候通过指定这个伪目标来执行其所在规则的定义的命令。
    • 使用伪目标主要是为了避免 Makefile中定义的执行命令的目标和工作目录下的实际文件出现名字冲突。
    • 如果Makefile同级目录有clean文件,当执行make clean时,规则因为没有依赖文件,所以目标被认为是最新的,因此后面的命令也就不会执行。
    • 加了 .PHONY : clean 之后,make clean 后面的命令就都会执行了。

    示例:

    .PHONY : clean
    clean:
    	rm *.o
    	rm abc
    
    • 1
    • 2
    • 3
    • 4

    6、Makefile条件判断

    ifeq (<参数 1>, <参数 2>) 
    ifeq ‘<参数1>’ “<参数2># 参数使用单引号、双引号都是可以的
    	<语句>
    else
    	<语句>
    endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    ifdef <变量名 >
    	<语句>
    else
    	<语句>
    endif
    
    • 1
    • 2
    • 3
    • 4
    • 5

    7、Makefile函数使用

    函数功能格式示例
    subst字符串替换$(subst ,,)$(subst zzk,ZZK,my name is zzk)
    patsubst模式字符串替换$(patsubst ,,)$(patsubst %.c,%.o,a.c b.c c.c)
    dir提取出目录部分$(dir )$(dir )
    notdir提取出文件名部分$(notdir )$(notdir )
    foreach循环$(foreach ,,)
    wildcard定义变量时的规则$(wildcard PATTERN……)$(wildcard *.c)
    • patsubst:此函数查找字符串 中的单词是否符合模式 ,如果匹配就用 来替换掉, 可以使用通配符“ “%”,表示任意长度的字符串,函数返回值就是替换后的字符串。如果 中也包涵“ “%”,那么 中的“ “%”将是 中的那个““%”所代表的字符串。
    • foreach:此函数的意思就是把参数 中的单词逐一取出来放到参数 中,然后再执行 所包含的表达式。每次 都会返回一个字符串,循环的过程中, 中所包含的每个字符串会以空格隔开,最后当整个循环结束时, 所返回的每个字符串所组成的整个字符串将会是函数 foreach 函数的返回值。
    # 函数调用方式
    $(函数名 参数集合 )
    ${函数名 参数集合 }
    
    • 1
    • 2
    • 3

    示例:

    # 搜索当前目录下所有的  .c 后缀的源文件
    SRC = $(wildcard *.c)
    # 把  $(SRC) 里面所有的 .c  文件替换成 .o  文件
    OBJ = $(patsubst %.c, %.o, $(SRC))
    
    • 1
    • 2
    • 3
    • 4

    参考

    【C语言中文网】GCC编译器30分钟入门教程
    Unix Makefile教程

  • 相关阅读:
    Java进阶过程
    rebase 和 merge合并代码
    Servlet | HTTP协议、模板方法设计模式
    libbpf-tools编译和使用步骤
    Spring Boot 2.x系列【27】应用篇之代码混淆
    Mysql——》Innodb存储引擎的索引
    Pytorch:BatchNorm1d、BatchNorm2d、BatchNorm3d
    港科夜闻|香港科大首位女校长叶玉如教授就职典职暨第三十届学位颁授仪式成功举办...
    ClickHouse(20)ClickHouse集成PostgreSQL表引擎详细解析
    ab4d:ab3d:ab2d--ZoomPanel for wpf
  • 原文地址:https://blog.csdn.net/p1279030826/article/details/126011392