最基本的Makefile:
---------------------------------------------------------------------------------------
原料:main.c
//main.c
#include "stdio.h"
void main()
{
printf("\nwelcom to learn Makefile\n");
}
编译:
gcc -o main main.c
MakeFile内容:
main:
gcc -o main main.c
clearn:
rm -rf main
---------------------------------------------------------------------------------------
1,以上内容没有产生main.o....
2,可以看到Makefile其实就是把要编译的命令写到特定的Makefile文件内
3,Makefile文件里最基本的东西
1>语法:
target:prerequisites ... ...
commond
....
...
target:prerequisites ... ...
commond
....
...
以这样的形式无限循环。
对应的例子:
main: 没有prerequisites
gcc -o main main.c
clearn:
rm -rf main
颜色对应。
2>注意:
commond 是在 target后另起一行,且必须以tab键开头,要不会语法错误
3>对上面的makefile进行修改
稍加修改的Makefile:
---------------------------------------------------------
main:main.o
gcc -o main main.o
main.o:main.c
gcc -c main.c
clearn:
rm -rf main
----------------------------------------------------------
运行make得到以下打印
----------------------------------------------------------
[root@bogon c2]# make
gcc -c main.c
gcc -o main main.o
----------------------------------------------------------
----->>>>相当重要的基础<<<<----
现象:先执行gcc -c main.c再执行 gcc -o main main.o,与自己写的命令是反的?
结论:1,汉语描述Makefile语法
目标:前置条件1前置条件2 。。。 。。。
[tab键]命令行1
[tab键]命令行2
。。。
。。。
前置条件1:前提条件1的前置条件1前提条件1的前置条件2 。。。 。。。
[tab键]命令行3
[tab键]命令行4
。。。
。。。
前置条件2:前提条件2的前置条件1 前提条件2的前置条件2 。。。。。。
[tab键]命令行5
[tab键]命令行6
。。。
。。。
2,makefile语法调用相当于函数递归调用
也就是目标如果有前置条件,则makefile会自动先找前置条件作为目标,运行改前置条件作为目标的命令。
从上面的语法看,应该这样执行
1>执行【目标】,发现有【前置条件1】【前置条件2】
2>找【前置条件1】为【伪目标】的地方,执行【命令3】【命令4】
3>找【前置条件2】为【伪目标】的地方,执行【命令5】【命令6】
4>真正的【目标】没有其他前置条件了,执行【命令1】【命令2】
遗留问题:
当然我写这个例子的时候还有一些比较有意思的东西,比如我把第一行的【前置条件1】改了,Makefile会出些不一样的过程,可能是Makefile的一些自动机制吧。。高手讲解下
比较怪的Makefile:
---------------------------------------------------------
main:main.o
gcc -o main main.o
main1.o:main.c
gcc -c main.c
clearn:
rm -rf main
----------------------------------------------------------
运行make得到以下打印
----------------------------------------------------------
[root@bogon c2]# make
cc -c -o main.o main.c
gcc -o main main.o
----------------------------------------------------------
我改了红绿两色的地方,最后运行meke后的到下面的打印,红的为怪异的地方,但编译过程是好的。高手解释下原因。