makefile

声明:转载自http://blog.csdn.net/bhsky/archive/2009/01/07/3727254.aspx

makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接-----但是不是所有的文件都需要重新编译,makefile能够纪录文件的信息,决定在链接的时候需要重新编译哪些文件! 

在unix系统下,makefile是与make命令配合使用的。 
--------------------------------------------------------------- 

看看Unix编程就会了解一些。VC会自动生成这些东西。 
--------------------------------------------------------------- 

现在Makefile文件好像用得越来越少了,深入浅出MFC写了。 
--------------------------------------------------------------- 

举个例子吧,我现在有main.c 、window.c 、model.c 、data.c 4个.c文件和window.h 、model.h 、data.h 3个.h文件。 
main.c是主程序,里面有main()函数。其他的都是模块。 

如果要生成最终的可执行文件,要做以下步骤: 
1、分别编译window.c 、model.c 、data.c 、main.c ,将会得到3个目标文件:window.o 、model.o 、data.o 、main.o 
2、把这4个.o (在windows下就是.obj)文件链接起来,得到main.out(在windows下就是main.exe)。 

那么这些文件就要有逻辑关系,否则编译器不知道怎么编译。 

all:main.out 
main.out:main.o window.o model.o data.o 
    gcc -o main.out main.o window.o model.o data.o 

#上面的意思是说: 
#all:main.out 
如果想要编译所有:make all,那么将会生成main.out可执行文件。 

#main.out:main.o window.o model.o data.o 
而要生成这个main.out,需要依赖main.o,window.o,model.o,data.o 4个文件。 

#    gcc -o main.out main.o window.o model.o data.o 
这句是调用编译器编译,vc用的是cl。变异的时候可以加上很多的参数、定义的宏、链接库路径等。 

当然,还没有完呢,这些main.out依赖的这些 .o 怎么来的? 

window.o:window.c window.h 
    gcc -c window.c 

model.o:model.c model.h 
    gcc -c model.c 

data.o:data.c data.h 
    gcc -c data.c 

上面的-c参数是指定编译器编译出一个.o文件就可以了,不要再寻找main()函数做链接工作。 

这些和到一起,就是一个makefile,当然这些功能还太少,可以加上很多别的项目。但宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。

posted @ 2011-04-07 00:47  左手写诗  阅读(269)  评论(0)    收藏  举报