• Makefile学习笔记——Makefile通配符的使用


    Makefile 是可以使用 shell 命令的,所以 shell 支持的通配符在 Makefile 中也是同样适用的。 shell 中使用的通配符有:"*","?","[...]"。具体看一下这些通配符的表示含义和具体的使用方法。

    通配符使用说明
    * 匹配0个或者是任意个字符
    匹配任意一个字符
    [] 我们可以指定匹配的字符放在 "[]" 中

    通配符可以出现在模式的规则中,也可以出现在命令中,详细的使用情况如下。

    实例 1:

    .PHONY:clean
    clean:
    rm -rf *.o test
    

      

    这是在 Makefile 中经常使用的规则语句。这个实例可以说明通配符可以使用在规则的命令当中,表示的是任意的以 .o 结尾的文件。
    实例 2:

    test:*.c
    gcc -o $@ $^
    

      

    这个实例可以说明我们的通配符不仅可以使用在规则的命令中,还可以使用在规则中。用来表示生所有的以 .c 结尾的文件。

    但是如果我们的通配符使用在依赖的规则中的话一定要注意这个问题:不能通过引用变量的方式来使用,如下所示。

    OBJ=*.c
    test:$(OBJ)
    gcc -o $@ $^
    

      

    我们去执行这个命令的时候会出现错误,提示我们没有 "*.c" 文件,实例中我们相要表示的是当前目录下所有的 ".c" 文件,但是我们在使用的时候并没有展开,而是直接识别成了一个文件。文件名是 "*.c"。

    如果我们就是相要通过引用变量的话,我们要使用一个函数 "wildcard",这个函数在我们引用变量的时候,会帮我们展开。我们把上面的代码修改一下就可以使用了。

    OBJ=$(wildcard *.c)
    test:$(OBJ)
    gcc -o $@ $^
    

      

    这样我们再去使用的时候就可以了。调用函数的时候,会帮我们自动展开函数。

    还有一个和通配符 "*" 相类似的字符,这个字符是 "%",也是匹配任意个字符,使用在我们的的规则当中。

    test:test.o test1.o
    gcc -o $@ $^
    %.o:%.c
    gcc -o $@ $^
    

      

     "%.o" 把我们需要的所有的 ".o" 文件组合成为一个列表,从列表中挨个取出的每一个文件,"%" 表示取出来文件的文件名(不包含后缀),然后找到文件中和 "%"名称相同的 ".c" 文件,然后执行下面的命令,直到列表中的文件全部被取出来为止。

    这个属于 Makefile 中静态模规则:规则存在多个目标,并且不同的目标可以根据目标文件的名字来自动构造出依赖文件。跟我们的多规则目标的意思相近,但是又不相同。

    原文链接:http://c.biancheng.net/view/7111.html

    PS:

    $@  表示目标文件
    $^  表示所有的依赖文件
    $<  表示第一个依赖文件
    $?  表示比目标还要新的依赖文件列表
    

      

    如一个目录下有如下文件:

    $ ls
    hello.c  hi.c  main.c  Makefile

    按照 Makefile 规则规规矩矩的写:

    复制代码
    main: main.o hello.o hi.o
            gcc -o main main.o hello.o hi.o
    
    main.o: main.c
            cc -c main.c
    
    hello.o: hello.c
            cc -c hello.c
    
    hi.o: hi.c
            cc -c hi.c
    
    clean:
            rm *.o
            rm main
    复制代码

    改为用上述符号进行替代:

    复制代码
    main: main.o hello.o hi.o
            gcc -o $@ $^
    main.o: main.c
            cc -c $<
    hello.o: hello.c
            cc -c $<
    hi.o: hi.c
            cc -c $<
    clean:
            rm *.o
            rm main
  • 相关阅读:
    正交矩阵(部分转载)
    向量的点乘和叉乘
    随机森林
    PCA和LDA
    SIFT和SURF特征(草稿)
    12-赵志勇机器学习-Label_Propagation
    11-赵志勇机器学习-DBSCAN聚类
    09-赵志勇机器学习-k-means
    10-赵志勇机器学习-meanshift
    09-numpy-笔记-repeat
  • 原文地址:https://www.cnblogs.com/young-dalong/p/15152812.html
Copyright © 2020-2023  润新知