makefile文件的书写规则(make和makefile)

对于makefile,掌握一个规则,两个变量和三个函数。下面介绍一个规则。

makefile的作用:一个项目代码的管理工具。当一个项目的代码文件数(如.c文件)太多,用gcc编译会太麻烦,如果全部文件一次性编译,一个文件有错误,所有文件都需要重新编译。如果每个文件单独编译,则十分麻烦。因此,就有项目代码管理工具makefile。项目代码编译管理;节省编译项目的时间;一次编写,终身受益。

[root@localhost src]# ls
add.c  div.c  libM1.so  main.c  mul.c  sub.c
[root@localhost src]# gcc -pedantic -Wall -pipe -ggdb3 *.c -o zsx -I ../include/
[root@localhost src]# ls
add.c  div.c  libM1.so  main.c  mul.c  sub.c  zsx  //可以看出最终只是生成了zsx目标文件,因此有一个.c文件改变了,就会全部重新编译,然后链接。
[root@localhost src]# ./zsx 
sum = 26
 

规则如下:

规则中的三要素:目标,依赖,命令

目标:依赖条件

       命令  //tab缩进,必须要缩进

[root@localhost src]# ls
add.c  div.c  libM1.so  main.c  mul.c  sub.c
[root@localhost src]# vim makefile
zsx:main.c sub.c add.c mul.c div.c
        gcc -pipe -pedantic -Wall -ggdb3 main.c sub.c add.c mul.c div.c -o zsx -I ../include //第二行必须有一个tab缩进

[root@localhost src]# make
gcc -pipe -pedantic -Wall -ggdb3 main.c sub.c add.c mul.c div.c -o zsx -I ../include
[root@localhost src]# ls
add.c  div.c  libM1.so  main.c  makefile  mul.c  sub.c  zsx
[root@localhost src]# ./zsx
sum = 26
//上述中,生成的最终文件zsx自动会跟makefile文件在同一个目录。注意两点:1.对于依赖条件中的几个文件如果不跟makefile在同一个目录的话,必须指定其所在目录(如../main.c、/mnt/hgfs/shared/ggc/Calc/add.c等),这样makefile才能找到依赖条件所需的文件在哪里;2.在命令中,要分析清楚该命令是否需要指出头文件、库文件(-I  -L  -static  -l)。

举例:

[root@localhost src]# ls
add.c  div.c  libM1.so  main.c  makefile  mul.c  sub.c
[root@localhost src]# vim makefile
zsx:main.o add.o sub.o mul.o div.o
        gcc -ggdb3 main.o add.o sub.o mul.o div.o -o zsx
main.o:main.c
        gcc -pedantic -Wall -pipe -c main.c -o main.o -I ../include
add.o:add.c
        gcc -pedantic -Wall -pipe -c add.c -o add.o
sub.o:sub.c
        gcc -pedantic -Wall -pipe -c sub.c -o sub.o 
mul.o:mul.c
        gcc -pedantic -Wall -pipe -c mul.c -o mul.o 
div.o:div.c
        gcc -pedantic -Wall -pipe -c div.c -o div.o

[root@localhost src]# make
gcc -pedantic -Wall -pipe -c main.c -o main.o -I ../include  //生成main.o
gcc -pedantic -Wall -pipe -c add.c -o add.o //生成add.o
gcc -pedantic -Wall -pipe -c sub.c -o sub.o //生成sub.o
gcc -pedantic -Wall -pipe -c mul.c -o mul.o //生成mul.o
gcc -pedantic -Wall -pipe -c div.c -o div.o //生成div.o
gcc -ggdb3 main.o add.o sub.o mul.o div.o -o zsx  //生成最终目标  且最后链接时加上调试信息 -ggdb3
[root@localhost src]# ./zsx
sum = 26
[root@localhost src]# ls
add.c  add.o  div.c  div.o  libM1.so  main.c  main.o  makefile  mul.c  mul.o  sub.c  sub.o  zsx  //可以看出,既生成了以及中间文件.o,还生成了最终目标文件zsx。因为几个中间文件.o在makefile中也是目标文件,为次级目标文件。
[root@localhost src]# make
make: `zsx' is up to date.  //可以发现再次make没有反应,这是因为make检测到所有的文件都是最新的(即没有改动过),因此不需要再次做重复的工作。
[root@localhost src]# rm -f zsx
[root@localhost src]# make
gcc -ggdb3 main.o add.o sub.o mul.o div.o -o zsx  //此时make有了反应,因为make检测到zsx目标文件删除了,因此只需要执行最后一步链接操作即可。
[root@localhost src]# ./zsx
sum = 26

[root@localhost src]# vim add.c   //修改了add.c的内容

[root@localhost src]# make

gcc -pedantic -Wall -pipe -c add.c -o add.o   //只是重新编译了add.c,编译很费时间

gcc -ggdb3 main.o add.o sub.o mul.o div.o -o zsx    //更新最终目标, 链接不费时间

//最终目标一定要写在第一行,如果未写在第一行,则需要:all:zsx  --> all指定生成的最终目标为zsx

总结:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值