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

Linux系统编程 36 -makefile的一个规则,第1张

Linux系统编程 36 -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
#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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5659101.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存