openKylin论坛

 找回密码

Makefile 简介 [复制链接]

1.为了使用 make 程序,你就需要 makefile 文件来告诉 make 要做些什么工作
2.通常, makefile 文件会告诉 make 如何编译和连接一个文件。当明确指出时, makefile 还可以告诉 make 运行各种命令(例如,作为清理操作而删除某些文件)
3.make 的执行过程分为两个不同的阶段。在第一个阶段,它读取所有的 makefile 文件以及包含的makefile 文件等,记录所有的变量及其值、隐式的或显式的规则,并构造出所有目标对象及其先决条件的一幅全景图。在第二阶段期间, make 就使用这些内部结构来确定哪个目标对象需要被重建,并且使用相应的规则来操作。
4.当 make 重新编译程序时,每个修改过的 C 代码文件必须被重新编译。如果一个头文件被修改过了,那么为了确保正确,每一个包含该头文件的 C 代码程序都将被重新编译。每次编译操作都产生一个与源程序对应的目标文件 (object file) 。最终,如果任何源代码文件被编译过了,那么所有的目标文件不管是刚编译完的还是以前就编译好的必须连接在一起以生成新的可执行文件。
5.简单的 makefile 文件含有一些规则,这些规则具有如下的形式:
目标 (target)... : 先决条件 (prerequisites)...
命令 (command)
...
...
6.其中 ' 目标 ' 对象通常是程序生成的一个文件的名称;例如是一个可执行文件或目标文件。目标也可以是所要采取活动的名字,比如 ' 清除 '('clean') 。
7.' 先决条件 ' 是一个或多个文件名,是用作产生目标的输入条件。通常一个目标依赖几个文件。
8.而 ' 命令 ' 是 make 需要执行的操作。一个规则可以有多个命令,每一个命令自成一行。请注意,你需要在每个命令行之前键入一个制表符!这是粗心者常常忽略的地方。
9.必须小心地设置命令,使得命令能够在 make 发现先决条件的目录中找到需要的先决条件。需要通过使用自动变量来做到。自动变量是一种在命令行上根据具体情况能被自动替换的变量。自动变量的值是基于目标对象及其先决条件而在命令执行前设置的。
10.例如, ’$^’ 的值表示规则的所有先决条件,包括它们所处目录的名称;
11.’$<’ 的值表示规则中的第一个先决条件; ’$@’ 表示目标对象;
12.先决条件还常包含头文件,而这些头文件并不愿在命令中说明。此时自动变量 ’$<’ 正是第一个先决条件。
13.例如:
foo.o : foo.c defs.h hack.h
           cc -c $(CFLAGS) $< -o $@      其中的 ’$<’ 就会被自动地替换成 foo.c ,而 $@ 则会被替换为 foo.o
14.为了让 make 能使用习惯用法来更新一个目标对象,你可以不指定命令,写一个不带命令的规则或者不写规则。此时 make 程序将会根据源程序文件的类型(程序的后缀)来判断要使用哪个隐式规则。
15.双后缀规则是用一对后缀定义的:源后缀和目标后缀。相应的隐式先决条件是通过使用文件名中的源后缀替换目标后缀后得到。因此,此时下面的 ’$<’ 值是 *.c 文件名。而正条 make 规则的含义是将 *.c 程序编译成 *.s 代码。
.c.s:
           $(CC) $(CFLAGS) \
           -nostdinc -Iinclude -S -o $*.s $<
16.通常命令是属于一个具有先决条件的规则,并在任何先决条件改变时用于生成一个目标 (target) 文件。然而,为目标而指定命令的规则也并不一定要有先决条件。
17.一个 makefile 文件也可以含有除规则以外的其它文字,但一个简单的 makefile 文件只需要含有适当的规则。
18.makefile 文件最后生成的依赖关系是用于让 make 来确定是否需要重建一个目标对象。比如当某个头文件被改动过后, make 就通过这些依赖关系,重新编译与该头文件有关的所有 *.c 文件。

楼主
发表于 2013-11-22 16:46:28
回复

使用道具 举报

openKylin

GMT+8, 2024-5-21 03:32 , Processed in 0.016047 second(s), 17 queries , Gzip On.

Copyright ©2022 openKylin. All Rights Reserved .

ICP No. 15002470-12 Tianjin

快速回复 返回顶部 返回列表