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<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
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 = %d\n",a,b,add(a,b));
printf("%d-%d = %d\n",a,b,sub(a,b));
printf("%d/%d = %d\n",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
本文探讨了如何改进Makefile,以便在多人协作中更高效地管理多个C源文件的编译。通过理解makefile的工作原理,我们学习了如何根据依赖关系动态编译,并展示了如何仅重新编译更改的部分,从而提升编译速度。
2047

被折叠的 条评论
为什么被折叠?



