码迷,mamicode.com
首页 > 系统相关 > 详细

linux之Makefile 编写、规则、伪目标

时间:2019-03-23 22:29:15      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:需要   mamicode   创建   std   help   orm   使用命令   修改   file   

  什么是Makefile?首先,make是一个工具程序(Utility software),是一种控制编译或者重复编译软件的工具;make可以自动管理软件编译的内容、方式和时机从而使程序员能够把精力集中在编写代码上。那make怎样工作呢?其实make是通过makefile文件实现的。makefile是一个文本形式的数据库文件。其中包含一些规则,这些规则告诉make需要编译哪些文件、怎样编译这些文件以及在什么样的条件下去编译。

  关于Makefile的基本规则:

target: dependency [dependency [...]]
           command
           command
           [...]
每个命令的第一个字符必须是制表符,使用空格代替是不正确的。

其中,target是需要创建的二进制文件或目标文件,虽然目标体通常是程序,但它们也可以是文本文件、手册页面等任何东西甚至可以被用作测试和设置环境变量。dependency是在创建target时需要输入的一个或者是多个文件的列表。命令序列是创建target文件所需的步骤,如编译命令。一般,没有特殊指定的情况下,make的工作目录就是当前的目录。当GNU make被调用时会顺序查找名为GNUmakefile、makefile或者是Makefile的文件,但不知出于于某种不可描述的原因,绝大部分的Linux程序员习惯性的使用 Makefile这种形式。 

  简单的makefile写法:

 首先有这么几个简单的程序 howdy.c helper.h helper.c

 howdy.c

#include<stdio.h>
#include"helper.h"
int main()
{
        printf("hello,linux programming world\n");
        msg();
        return 0;
}

头文件 helper.h

void msg(void);

helper.c

#include<stdio.h>
void msg(void)
{
        printf("This message sent form helper.c .\n");
}

 好了,利用上述的这些程序写一个简单的Makefile文件

    

howdy:howdy.o helper.o helper.h
        gcc howdy.o helper.o -o howdy
helper.o:helper.c helper.h
        gcc -c helper.c 
howdy.o:howdy.c
        gcc -c howdy.c
clean:
        rm howdy *.o

要编译howdy,只要在Makefile目录下键入make即可。第一个目标体howdy称为默认(default)目标体--这就是该Makefile文件要创建的文件。howdy有三个依赖体,分别为howdy.o helper.o helper.h;要生成howdy这个文件就必须要他所依赖的这三个文件。第二行就是调用编译器的命令来供make执行来创建howdy文件,其中helper.h也列入依赖体的原因是为了防止编译器调用未申明的函数产生错误。接下来的规则是告诉make怎样生成单个目标文件:helper.o和howdy.o。这两个规则用了gcc -c选项,其含义为只编译但不链接文件。

技术图片

    嗯,,,大概的编译链接过程就是上图这样,howdy.c和helper.c这两个源文件经过预处理后编译成目标文件,然后连接器把来自howdy.o和helper.o的目标代码以及标准库和c启动代码链接到一起生成可执行的二进制文件howdy。通常情况下,如果在依赖体helper.o和howdy.o不存在的情况下使用命令编译howdy,那么gcc会报错并退出。On the other hand,编译器在看到howdy需要这两个文件(以及helper.h)后,make先看它们是否存在,如果不存在则根据规则命令生成它们,然后再根据第一条规则生成howdy。显然地,如果helper.h不存在,也会报错退出,因为Makefile文件中并没有规则命令生成helper.h。              

  好了,大概明白make是怎么执行的了,那新的问题又来了,make怎么知道什么时候该重新编译一个新的文件呢?  其实很简单:如果指定的目标文件不存在,那么毫无疑问,make就会根据规则命令生成它;如果目标文件已经存在,那么make就会将目标文件和依赖文件的时间戳进行对比,如果有一个以上的依赖文件比目标文件新(就是依赖文件的修改时间比目标文件的时间新),那么make就会重新编译生成新的目标体。  

 

伪目标:

什么是伪目标?伪目标就是上面Makefile文件的clean就是伪目标,伪目标就是不对应实际的文件。但是,由于伪目标没有依赖体,所以它的命令是不会自动被make执行的,如果要编译执行这个目标体,那么只需 make clean,编译器就会编译执行clean的命令。但是,如果刚好有个名字叫做clean的文件存在,那么make就会发现它,但是clean没有依赖体,所以make就会认为clean已经是最新的文件从而不会执行其命令。为了处理这种情况,就需要使用特殊的目标体.PHONY。.PHONY的依赖体文件的含义和通常的一样,但是make不检查是否存在有文件名和依赖体中的一个名字相匹配的文件,而是直接执行与之相关的命令。如果使用.PHONY,上述的Makefile文件就成了下面这样

howdy:howdy.o helper.o helper.h
        gcc howdy.o helper.o -o howdy
helper.o:helper.c helper.h
        gcc -c helper.c 
howdy.o:howdy.c
        gcc -c howdy.c
#hello:hello.c
#       gcc hello.c -o hello
#all:howdy hello
.PHONY
clean:
        rm howdy *.o

什么意思?一句话,意思就是:make在更新目标文件时,不管clean后面有没有依赖,都会直接执行clean下面的命令。

           

linux之Makefile 编写、规则、伪目标

标签:需要   mamicode   创建   std   help   orm   使用命令   修改   file   

原文地址:https://www.cnblogs.com/sugarxt/p/10585865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!