Makefile文件学习

       之前搭建环境遇到makefile 文件,只知道是类似于脚本的文件,输入make命令就会执行makefile文件其中的命令,稀里糊涂地把环境搭建好了,感觉还是看得懂点makefile文件,在操作中会少走很多弯路。在网上找了一下关于makefile文件的资料,有很多也很全面,这里记录一下,以备以后查阅。详细的关于makefile使用总结的可以看一下这篇文章http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225

一、简介

    makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

二、规则

Makefile的规则
    target ... : prerequisites ...
            command
            ...
            ...
    target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)
    prerequisites就是,要生成那个target所需要的文件或是目标。
    command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。 说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是 Makefile的规则。也就是Makefile中最核心的内容。....省略很多,关于显式规则,变量定义详细请参考开头给的文章链接。

另外经常会遇见.PHONY,这里也说一下

PHONY目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能。举例:

如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。例如:
  clean:
  rm *.o temp
因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有依赖文件,文件"clean"始终是最新的,命令永远不会 执行;为避免这个问题,可使用".PHONY"指明该目标。如:
  .PHONY : clean
  这样执行"make clean"会无视"clean"文件存在与否。

已知phony 目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索。这就是声明phony 目标会改善性能的原因,即使你并不担心实际文件存在与否。

关于PHONY的理解,这里可以参考这篇文章https://www.cnblogs.com/hnrainll/archive/2011/04/12/2013377.html

三、make命令参数

格式 :make(选项)(参数)

选项

扫描二维码关注公众号,回复: 2397977 查看本文章

-f:指定“makefile”文件;
-i:忽略命令执行返回的出错信息;
-s:沉默模式,在执行之前不输出相应的命令行信息;
-r:禁止使用build-in规则;
-n:非执行模式,输出所有执行命令,但并不执行;
-t:更新目标文件;
-q:make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息;
-p:输出所有宏定义和目标文件描述;
-d:Debug模式,输出有关文件和检测时间的详细信息。

Linux下常用选项与Unix系统中稍有不同,下面是不同的部分:

-c dir:在读取 makefile 之前改变到指定的目录dir;
-I dir:当包含其他 makefile文件时,利用该选项指定搜索目录;
-h:help文挡,显示所有的make选项;
-w:在处理 makefile 之前和之后,都显示工作目录。

我目前的理解也就这么多,后面想看的话,就参考其中的文章链接继续学习了。

猜你喜欢

转载自blog.csdn.net/louvinci/article/details/81192909