C语言学习(三)Makefile基础学习详解

所谓工程管理器,顾名思义,是指管理较多的文件的。试想一下,有一个上百个文件的代码构成的项目,如果其中只有一个或少数几个文件进行了修改,按照之前所学的Gcc 编译工具,就(第一个缺点)不得不把这所有的文件重新编译一遍,因为编译器并不知道哪些文件是最近更新的,而只知道需要包含这些文件才能把源代码编译成可执行文件,于是,(第二个缺点)程序员就不能不再重新输入数目如此庞大的文件名以完成最后的编译工作。
       但是,请仔细回想一下程序编译过程,编译过程是分为编译、汇编、链接不同阶段的,其中编译阶段仅检查语法错误以及函数与变量的声明是否正确声明了,在链接阶段则主要完成是函数和全局变量的链接。因此,那些没有改动的源代码根本不需要重新编译,而只要把它们重新链接进去就可以了。所以,人们就希望有一个工程管理器能够自动识别更新了的文件代码,同时又不需要重复输入冗长的命令行,这样,Make工程管理器也就应运而生了。
       实际上,Make 工程管理器也就是个“自动编译管理器” ,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入 Makefile 文件的内容来执行大量的编译工作。用户只需编写一次简单的编译语句就可以了。它大大提高了实际项目的工作效率,而且几乎所有 Linux 下的项目编程均会涉及它。

makefile 是 make 读入的唯一配置文件,因此本节的内容实际就是讲述 Makefile 的编写规则。
1、makefile的基本格式:target:dependency
                                               command
注:若dependencyt比target日期新或target不存在,则make会执行command
2、makefile中变量的使用
OBJECTS = sum.o sub.o operator.o             #定义变量
$(OBJECTS)                                             #使用变量
3、makefile的自动推导(隐晦规则) 
     GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中。如:如果make找到一个main.o,那么main.c就会是main.o的依赖文件。并且gcc -c main.c -o main.o也会被推导出来。

本文重点通过一个具体的例子,由浅入深讲解

operator.c

#include <stdio.h>

int add(int a,int b)
{
    return a + b;
}

int sub(int a,int b)
{
    return a - b;
}

int main()
{
    int a = 3;
    int b = 2;

    printf("%d %d\n",add(a,b),sub(a,b));

    return 0;
}
 

 1.直接编译 gcc operator.c    →a.out

2.联合编译

add.c

int add(int a,int b)
{
    return a + b;
}

sub.c

 int sub(int a,int b)
{
    return a - b;
}

 operator.c

#include <stdio.h>

int main()
{
    int a = 3;
    int b = 2;

    printf("%d %d\n",add(a,b),sub(a,b));

    return 0;
}

gcc add.c sub.c operator.c      →a.out

3.makefile 基本使用

operator:add.c sub.c operator.c
      gcc add.c sub.c operator.c -o operator

省去了再次输入大量文件名,但所有文件还是再次编译

4. 升级版

operator:add.o sub.o operator.o
    gcc add.o sub.o operator.o -o operator
add.o:add.c
    gcc -c add.c -o add.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
opertor.o:operator.c
    gcc -c operator.c -o operator.o
clean:
    rm -f *.o operator

分析:改进的是,只编译时间更新的源文件,然后所有再进行链接

手动make clean清除多余文件 

解决了gcc的两个问题

5.再次改进

OBJECT=add.o sub.o operator.o
operator:$(OBJECT)
    cc $(OBJECT) -o operator
clean:
    rm -f *.o operator
 

分析: 与上一个写法的改进点是,使用了变量,再次减少了工作量

利用了隐晦规则,自动推导功能----只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中。

猜你喜欢

转载自blog.csdn.net/ls_dashang/article/details/81123151