Makefile是什么东东?有什么用?怎么用?

时间:2021-10-25 02:44:22
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,当然这些功能还太少,可以加上很多别的项目。但宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。