一、程序的编译及链接
我们编译程序,无非是想要得到一个可执行文件,而这个过程则是经过这两步:
***.c->编译->***.o->链接->可执行文件。即.c经过编译得到.o文件,.o文件是一个中间文件,再对这些中间文件进行链接最终可得到可执行文件。
二、Makefile的规则
首先,来看一看Makefile的书写规则:
target ... : prerequisites ...
command
...
...
target也就是一个目标文件,可以是.o文件,也可以是执行文件,还可以是一个标签(Label)。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令(任意的Shell命令)。这里要注意的是在命令前面要加上一个tab键,不是空格,是按一个tab键按出来的空格。
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比 target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则,也就是Makefile中最核心的内容。这是Makefile的主线和核心,但要写好一个Makefile还得继续努力。
三、一个最简单的Makefile例子
如有一个工程,含有3个头文件及四个c文件,那为了生成所需的可执行文件,这时的Makefile可以这样写:
test:main.o t1.o t2.o t3.o
gcc –o test main.o t1.o t2.o t3.o
main.o:main.c
gcc –c main.c
t1.o:t1.c t1.h
gcc –c t1.c
t2.o:t2.c t2.h
gcc –c t2.c
t3.o:t3.c t3.h
gcc –c t3.c
clean:
rm test main.o t1.o t2.o t3.o
到这里一个最简单的makefile就写好了,把它的名字保存为Makefile就可以了,这时你只要在终端敲一下make,它就自动帮你编译链接了^_^如果敲入make clean,它将删掉那些中间文件及可执行文件。
*********************************************************************************************
以下为深入知识:
$(aaa), aaa 是变量,一定会在哪个地方定义的
Makefile有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:
$@--目标文件,
$^--所有的依赖文件,
$<--第一个依赖文件.
如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为: # 这是简化后的Makefile # 记得我们的优化和警告选项吗?
main:main.o mytool1.o mytool2.o
gcc -O2 -o $@ $^ #gcc -O2 -o main(目标文件) main.o mytool1.o mytool2.o (所有的依赖文件)
main.o:main.c mytool1.h mytool2.h
gcc -O2 -Wall -c $< -I. #gcc -O2 -Wall -c main.c (第一个依赖文件)
mytool1.o:mytool1.c mytool1.h
gcc -O2 -Wall -c $< -I. #gcc -O2 -Wall -c mytool1.c (第一个依赖文件)
mytool2.o:mytool2.c mytool2.h
gcc -O2 -Wall -c $< -I. #gcc -O2 -Wall -c mytool2.c (第一个依赖文件)
经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点(唉,看来程序员都是大懒鬼哦 ^_^). 为此make又有了一些缺省的规则
这里我们学习一个Makefile的缺省规则
.c.o:
gcc -c $<
这个规则表示所有的 .o文件都是依赖与其相应的.c文件的.例如mytool.o依赖于mytool.c这样Makefile还可以变为:
# 这是再一次简化后的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o:
gcc -c $< -I.
如果你还是嫌这样太麻烦的话,我们还可以进行一些简化工作.为此我们来学习一下Makefile的一些缺省的宏定义 Makefile一般有很多很多的宏,我们这里只是学习几个常用的宏.
CC 表示我们的编译器名称,缺省值为cc.
CFLAGS 表示我们想给编译器的编译选项
LDLIBS 表示我们的在编译的时候编译器的连接库选项.(我们的这个程序中还用不到这个选项)
使用了上面的宏后我们的Makefile可以是
CC=gcc
CFLAGS=-g -Wall -O2 -I.
main:main.o mytool1.o mytool2.o
.c.o:
CC CFLAGS $<
好了,我们的Makefile 也差不多了,可以输入make -f Makefile来运行Makefile文件。如果想知道更多的关于Makefile规则可以查看相应的文档. 使用(man make 或者是info make)
本文介绍了一个简单的Makefile实例,展示了如何通过Makefile自动化程序的编译和链接过程,并讲解了Makefile的基本规则及其核心概念。

2059

被折叠的 条评论
为什么被折叠?



