Linux系统编程 36 -makefile的一个规则
学习笔记
从静态库文件中拷贝文件
$cd 36maketest/ $ls add.c add.o div1.c div1.o sub.c sub.o $rm ./*.o
add.c 程序
$cat add.c int add(int a,int b) { return (a+b); }
div1.c 程序如下
$cat div1.c int div1(int a, int b) { return (a/b); }
sub.c 程序如下:
$cat sub.c int sub(int a, int b) { return (a-b); }
hello.c 程序如下:
$cat hello.c #include#include #include #include #include int add(int , int); int sub(int , int); int div1(int ,int); int main(int argc, char *argv[]) { int a =10, b=5; printf("%d+%d = %dn",a,b,add(a,b)); printf("%d-%d = %dn",a,b,sub(a,b)); printf("%d/%d = %dn",a,b,div1(a,b)); return 0; }
几个c文件多文件联编生成一个可执行文件
$gcc hello.c sub.c add.c div1.c -o a.out $./a.out 10+5 = 15 10-5 = 5 10/5 = 2 $
$ls add.c a.out div1.c hello.c sub.c $rm a.out
制作makefile
$cat makefile a.out:hello.c add.c sub.c div1.c gcc hello.c add.c sub.c div1.c -o a.out
make
$make gcc hello.c add.c sub.c div1.c -o a.out $./a.out 10+5 = 15 10-5 = 5 10/5 = 2
有些不合理的地方
如果是几个人一起维护,每个人负责一个.c
如果只有一个.c有变化,按上面的话,每次都要全编。
而全编实际上不合理。
因此要做修改
正常生成执行文件的过程
$ls add.c add.o a.out div1. div1.c div1.o hello.c makefile sub.c sub.o $gcc add.o sub.o div1.o hello.o -o a.out gcc: error: hello.o: No such file or directory $gcc -c hello.c -o hello.o $gcc add.o sub.o div1.o hello.o -o a.out $./a.out 10+5 = 15 10-5 = 5 10/5 = 2
新的makefile
$cat makefile a.out:hello.o add.o sub.o div1.o gcc hello.o add.o sub.o div1.o -o a.out hello.o:hello.c gcc -c hello.c -o hello.o add.o:add.c gcc -c add.c -o add.o sub.o:sub.c gcc -c sub.c -o sub.o div1.o:div1.c gcc -c div1.c -o div1.o
make命令
$rm ./*.o $make gcc -c hello.c -o hello.o gcc -c add.c -o add.o gcc -c sub.c -o sub.o gcc -c div1.c -o div1.o gcc hello.o add.o sub.o div1.o -o a.out $./a.out 10+5 = 15 10-5 = 5 10/5 = 2
修改div1.c
$vi div1.c $cat div1.c int div1(int a, int b) { return (a/b/2); }
按照想法
提高编译速度,加法 减法 hello都应该略过
$make gcc -c div1.c -o div1.o gcc hello.o add.o sub.o div1.o -o a.out $./a.out 10+5 = 15 10-5 = 5 10/5 = 1
为什么makefile 这么智能
1.检查规则中的目标是否需要更新;必须先检查他的所有依赖,
依赖中有任意一个文件被更新,则目标必须更新
白话:当依赖条件比目标文件晚的时候
说明依赖改了,所以目标也需要更新
2.依赖条件如果不存在,找寻新的规则去产生或者创建依赖
makefile 为什么反着写的
修改makefile
$cat makefile hello.o:hello.c gcc -c hello.c -o hello.o add.o:add.c gcc -c add.c -o add.o sub.o:sub.c gcc -c sub.c -o sub.o div1.o:div1.c gcc -c div1.c -o div1.o a.out:hello.o add.o sub.o div1.o gcc hello.o add.o sub.o div1.o -o a.out $rm ./*.o a.out $ls add.c div1. div1.c hello.c makefile sub.c $make gcc -c hello.c -o hello.o $
发现只执行一条语句
gcc -c hello.c -o hello.o
为什么?
因为它是第一行
makefile 默认属性:把makefile碰到的第一组规则当中的目标作为
终究任务目标
可以修改终极目标(要知道)
All:a.out
$ls add.c div1. div1.c hello.c makefile sub.c $vi makefile $cat makefile #a.out:hello.c add.c sub.c div1.c # gcc hello.c add.c sub.c div1.c -o a.out #zhiding zhongji mubiao All:a.out hello.o:hello.c gcc -c hello.c -o hello.o add.o:add.c gcc -c add.c -o add.o sub.o:sub.c gcc -c sub.c -o sub.o div1.o:div1.c gcc -c div1.c -o div1.o a.out:hello.o add.o sub.o div1.o gcc hello.o add.o sub.o div1.o -o a.out
make
$make gcc -c hello.c -o hello.o gcc -c add.c -o add.o gcc -c sub.c -o sub.o gcc -c div1.c -o div1.o gcc hello.o add.o sub.o div1.o -o a.out
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)