作为Linux或Unix下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般开发情况下,大家都是手工写一个简单Makefile。下面先给一个最简单的示例代码:
#makefile示例 object= main.o function.o change:$(object) cc -o change $(object) mv change $(HOME)/bin main.o: cc -c main.c -I$(HOME)/program/date/include function.o: cc -c function.c -I$(HOME)/program/date/include clean: rm change $(object)说明:
这里是使用unix下的CC编译器,当然也能换成gcc
最后生成的可执行文件名:change
源程序文件:main.c function.c
.h文件(头文件)所在目录:$(HOME)/program/date/include
中间目标文件名:main.o function.o
当在shall中执行命令:
make clean将会执行
rm change $(object)删除文件: change main.o function.o
语句:
mv change $(HOME)/bin将最终生成的可执行文件移动到
$(HOME)/bin这一步可以不要,但这样符合目录管理规范,而且$(HOME)/bin一般在环境变量PATH中有设置,这样可以在任意目录下时也能运行可执行文件。
注意:
makefile编辑时另起一行,注意不能用空格,要用TAB键,否则会报错
makefile里面的注释用#,其它都会报错
Makefile简单介绍
Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。
Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。
一个简单的MakeFile例子
一、程序的编译及链接
我们编译程序,无非是想要得到一个可执行文件,而这个过程则是经过这两步:
***.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,它将删掉那些中间文件及可执行文件。