首页 > 代码库 > Makefile基础
Makefile基础
基础
运行make命令之后,make程序会在当前目前下寻找Makefile文件,根据Makefile文件中的内容执行具体的操作。
执行make命令后的结果如下:
Makefile的基础是如下的部分:
targets:prerequisites commands如上例所示:
a.out是targets,目标;
main.c是prerequisites,依赖;
剩余的部分开头是一个TAB,他们是命令;
make执行命令的条件是依赖比目标要新。
如果在上例执行后再运行make,结果如下:
这是因为main.c没有修改过,它比a.out要旧。
需要注意,目标和依赖都可以是多个,而只要任意依赖新于目标,都会导致命令重新执行。
以上示例中,目标是一个文件,但是它还可以是其它的。比如一个标签:
all就是一个标签。
标签永远比依赖要旧,即其下的命令一直会执行:
甚至可以没有依赖:
all对应命令也会一直执行。
标签可以有多个,但是它并不是顺序执行,make只会执行第一个遇到的标签。如下面的Makefile文件:
执行make的结果如下:
可以看到只有all标签会被执行。如果要执行bll,就需要显式地指定:
标签之间可以互相依赖:
执行的结果如下:
因为all依赖于bll,而bll又依赖于main.c,因此这里的执行顺序就是先执行bll对应的命令,然后再执行all对应的命令。
标签在Makefile文件中又称为伪目标,不应该与真正的目标文件具有相同的名字,而为了避免这种情况,Makefile提供了一个关键字.PHONY,用于声明伪目标。
像下面这个样子:
变量
Makefile文件中的变量就是一个个的字符串。
访问变量使用$(xx),其中xx是变量名。
下面是一个例子:
执行的结果是:
变量的赋值可以使用普通的"=",它有一个特点,如下例所示:
执行的结果是:
即,Makefile中使用=定义的变量可以访问到之后定义的变量。使用=得到的变量称为recursively expanded variable。
它有一个缺点就是会导致循环赋值,比如下面的例子:
为了避免这种情况,Makefile提供了另一个赋值操作符":=",称为Simply expanded variables。
它更接近于一般意义上的赋值,当:=右边引用了其它的变量,而该变量还没有定义或者要到之后才会定义,那么返回的就是空字符串。
另外的赋值操作符还有
“+=”:就是这是给变量追加值。
"?=":首先判断变量是否存在,如果不存在就赋值成右边的值,如果存在了,就什么也不做。
与变量赋值相关的还有几个指示符:
override:这个指示符出现的原因是,一般定义的变量会被make命令行中的参数覆盖,而使用了override的变量则不会。下面是一个例子:
在未使用override的情况下:
可以看到FLAG参数被make命令行中的参数替代了。
如果在定义变量的时候使用了override的话:
变量的值将不会受到make命令行参数的影响。
export:用于向下层的Makefile文件传递参数。默认情况下,只有在make命令行中的参数才会向下传递,但是使用export之后,在当前Makefile文件中定义的变量也会向下传递了。
Makefile中还存在几类特殊的变量:
Makefile基础
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。