| 
UID1精华积分77054威望 点宅币 个贡献 次宅之契约 份最后登录1970-1-1在线时间 小时 
 | 
 
| makefile是啥?是用来造文件的东西。当然啥文件都可以造,比如exe之类的。 
 为什么用makefile?因为它会根据你给的依赖项判断要造一个文件需要其它哪些文件,然后将这些文件都造好。当你在调试的时候,已经造好的文件不会再帮你造,以免浪费时间,而已经更新的源码则会帮你重新“造”一下,更新造出的文件。这样调试一个大项目的时候就可以很好地避免重复造已经造过的文件了。
 
 makefile到处都有,DOS下有Turbo C++ 3.0的make,Linux有make,而Windows可以用VC的nmake,也可以用Cygwin的make和MinGW的make。
 
 怎么用makefile?
 
 1、在一个文件夹下创建一个叫“makefile”的文件。
 
   
 2、用notepad++等编辑器打开它,写入生成规则。生成规则是这样的:
 
 目标文件名: 依赖文件名1 依赖文件名2 ...
 编译命令
 
 3、在命令行运行make,它就会为了编译目标文件名,而检查依赖文件是否存在,然后运行编译命令。
 编译命令前必须有一个tab缩进。makefile通过检查依赖关系来确定要编译的文件。
 假设是如下的情况。
 
 我写了个程序:a.c,b.c,c.c,d.c,a.h,b.h,c.h,d.h,共8个文件。
 其中a.c引用了a.h,b.c引用了b.h,c.c引用了c.h,d.c引用了d.h。
 那么a.c就依赖a.h,b.c就依赖b.h,c.c就依赖c.h,d.c就依赖d.h,才能编译。
 a.c编译后得到a.o,b.c编译后得到b.o,c.c编译后得到c.o,d.c编译后得到d.o,也就是编译产生中间文件。
 然后a.o、b.o、c.o、d.o一起链接,可以得到一个可执行文件,a.exe,就是我们需要造的文件了。
 这样的话,makefile要这样写:
 这样的话,第一次运行makefile的时候,它就会将a.c、b.c、c.c、d.c都编译为中间文件(a.o、b.o、c.o、d.o),然后再将这些中间文件链接为a.exe。复制代码all: a.exe
a.exe: a.o b.o c.o d.o
        链接器 a.o b.o c.o d.o -输出 a.exe
a.o: a.c a.h
        编译器 a.c -输出 a.o
b.o: b.c b.h
        编译器 b.c -输出 b.o
c.o: c.c c.h
        编译器 c.c -输出 c.o
d.o: d.c d.h
        编译器 d.c -输出 d.o
而如果我改动了a.h,那么再次运行makefile的时候,它就只编译a.c为a.o(因为a.c依赖a.h,而a.h被改动了),最后运行链接器将a.o和刚才产生的b.o、c.o、d.o一起链接为a.exe。
 如果我们并没有提供a.h、b.h、c.h或者d.h,那么makefile就会提示你:“a.c依赖a.h,但是你没说a.h怎么造。退出。”等类似的提示。
 
 makefile是可以使用变量的。比如这样:
 这样的话,编译a.c时,它实际运行的命令是:复制代码编译命令=-优化 -再优化 -强制优化 -绝对优化 -朝死里优化 -优化了再优化 -包含文件夹:d:\include
链接命令=-跨obj优化 -库文件夹:d:\lib
all: a.exe
a.exe: a.o
        链接器 $(链接命令) a.o -输出 a.exe
a.o: a.c a.h
        编译器 $(编译命令) a.c -输出 a.o
复制代码编译器 -优化 -再优化 -强制优化 -绝对优化 -朝死里优化 -优化了再优化 -包含文件夹:d:\include a.c -输出 a.o
链接器 -跨obj优化 -库文件夹:d:\lib a.o -输出 a.exe
 | 
 |