Linux下MakeFile文件

1. makefile文件是Linux下用于编译的规则文件,我们可以用make命令来运行makefile文件。makefile文件的基本规则如下:

          目标文件列表:依赖文件列表 [;命令语句]
                [命令语句]
                [命令语句]

       1).命令语句可以用分号和依赖文件列表子同一行,如果命令语句单独一行时,语句前面必须是tab。

       2).如果需要换行时,可以使用斜杠"/"来连接两行。

       3).隐含推导规则:当有一个.o目标文件时,如果没有相应的.c文件,那么makefile文件会自动推导出.c文件。如:

          main.o:main.h//相当于:main.o:main.h main.c
                    gcc -c main.c  -o main.o

3.make的工作原理:运行make命令时,首先通过目标文件列表找到相应的依赖文件,如果依赖的文件不存在,那么会查看其他依赖规则,知道生产相应的依赖文件。如果最后依赖文件还是不存在,那么make会退出,并报错。但是如果命令有错或者编译不成功,那么make会退出,但是不会报错。

4.如果目标文件后没有依赖文件那么执行makefile文件时,那么这个规则不会被执行。

5.隐含目标:可以使用.PHONY目标来定义伪目标。伪目标没有依赖文件。

.PHONY:clean
clean:
         rm file

或者:

clean:
         rm file

6.推导规则:make可以通过.o文件推导出相应的.c依赖文件,如果没有命令,可以通过推导规则,推导出相应的命令。

7.makefile文件的5个重要东西:显示规则、隐含规则、定义变量、文件指示和凝视(相当于独行注释)。

8.文件命名:默认情况下,make会在当前目录下按顺序寻找”GNUmakefile“、”makefile“、”Makefile“。当然也可以命名其他名字:那么运行的时候方式如下:make -f filename和make --file filename。

9.引用其他makefile。

include filename [filename....]

       可以使用include来包含其他makefile。这个include可以包含变量等。如果没有指定绝对路径或相对路径,那么首先会在当前目录下查找文件,如果没有找到,那么会到如下文件查找:

     1)、假设make运行时,有“-I”或“--include-dir”參数,那么make就会在这个參数所指定的文件夹下去寻找。
     2)、假设文件夹<prefix>/include(通常是:/usr/local/bin或/usr/include)存在的话,make也会去找。

       如果没有找到,那么首先会福利这个错误,继续其他导入,然后会再次尝试,如果还是没有找到,那么会产生一个致命错误。我们也可以通过在include前面加"-"来忽略这种错误,如下:

-include filename

10.makefile中的通配符

       "*"、“?”、"[......]"和"~"。其中"~"表示当前用户的$home文件夹

11.文件搜索

          1)如果没有指定文件搜索路径,那么只会在当前路径搜索文件。

          2)可以通过设置VPATH变量来指示搜索路径,不同路径通过“:”隔离。如:

                    VPATH=stc:../header

          3)可以通过vapth来指定不同文件到不同路径搜索。形式如下
                    vpath <pattern> <directories>   #符合pattern类型的文件到directories路径下查找

                    vpath <pattern>                         #删除pattern类型文件的查找路径

                     vapth                                         #删除所有文件的查找路径

              可以使用"%"来匹配一个或多个字符

12.伪目标

         伪目标一般没有依赖文件,一般不能与文件重名,但我们可以使用.PHONY来定义伪目标,那么这样这个目标就可以和文件伪目标重名,并且可以有依赖文件。

.PHONY: cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff
       rm program

cleanobj :
       rm *.o

cleandiff :
       rm *.diff

13.Makefile经常使用的一些函数

         在Makefile中也可以使用函数,函数使用方式为:$后面跟着左括号,然后是函数名,后面是用空格隔开的参数,最后是右括号。如下:    

      $(函数名 参数1,参数2)

      1)foreach函数,格式如下:

      $(foreach 参数1,参数2,参数3)

            意义:该函数将参数2的单词逐个取出放在参数1中,参数1然后用于参数3表达式,参数3表达是会返回一个字符串,如此循环结束。返回的字符串之间使用空格隔开。

      2)wildcard函数,格式如下:

      $(wildcard 参数)

            意义:该函数会匹配符合参数的列,最后返回一个列表

      3)patsubst函数,格式如下:

$(patsubst 参数1,参数2,参数3)

           意义:该函数会将参数3的单词逐个取出,然后看是否匹配参数1,如果匹配参数1,那么使用参数2替换。

14.一些系统变量

Makefile 中很多时候通过自动变量来简化书写, 各个自动变量的含义如下:

自动变量

含义

$@目标集合
$%当目标是函数库文件时, 表示其中的目标文件名
$<第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标
$?比目标新的依赖目标的集合
$^所有依赖目标的集合, 会去除重复的依赖目标
$+所有依赖目标的集合, 不会去除重复的依赖目标
$*这个是GNU make特有的, 其它的make不一定支持

  













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值