Linux系统编程 36 -makefile的一个规则

本文探讨了如何改进Makefile,以便在多人协作中更高效地管理多个C源文件的编译。通过理解makefile的工作原理,我们学习了如何根据依赖关系动态编译,并展示了如何仅重新编译更改的部分,从而提升编译速度。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值