Linux-C-Program:makefile

注:本文参照博客:https://blog.csdn.net/initphp/article/details/7692923php

1. 概述

Makefile是一个C语言的程序编译规则。它可以帮助C语言创建自动化编译流程。一旦写好,即可以经过执行make命令,来编译整个工程。svg

2. 示例说明

建立项目以下:
val.h和val.c
val.h工具

#include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    int val(int *x);

val.cspa

#include "val.h"
    int val(int *x) {
        puts("This is value=");
        printf("x:%d\n",*x);
        return 0;
    }

get.h和get.c
get.h.net

#include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    int get(int *x,int *y);

get.c命令行

#include "get.h"
    int get(int *x,int *y) {
        puts("This is get");
        return(*x)*(*y);
    }

sum.h和sum.c
sum.hcode

#include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    int sum(int *x,int *y);

sum.corm

#include "sum.h"
    #include "val.h"
    int sum(int *x,int *y){
        val(x);
        puts("This is sum method");
        return *x + *y;
    }

main.cxml

#include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include "sum.h"
    #include "get.h"
    int main(){
        int x = 10;
        int y = 20;
        int z = sum(&x,&y);
        puts("This is Main");
        printf("z:%d\n",z);
        x = 20;
        z = get(&x,&y);
        printf("z:%d\n",z);
        return 1;
}

2.1 无makefile编译

生成中间目标文件
执行:gcc -c val.c get.c sum.c main.c
生成可执行文件
执行:gcc -o main main.o val.o sum.o get.oblog

2.2 有makefile编译

编辑makefile文件
注意:命令行须要[tab]键的空格

main: get.o sum.o val.o main.o
        gcc -o main get.o sum.o val.o main.o
    main.o:main.c
        gcc -c main.c
    val.o:val.h val.c
        gcc -c val.c
    sum.o:val.h sum.h sum.c
        gcc -c sum.c
    get.o:get.h get.c
        gcc -c get.c
    clean:
        rm -rf *.o

执行make命令

3.Makefile详解

3.1 Makefile的文件名称

makefile或者Makefile,通常采用大写(大写比较引人注目)。
当执行make命令时,工具会从当前目录寻找makefile文件。

3.2 目标可执行文件

main:get.o sum.o val.o main.o,main为目标可执行文件,也就是编译最后成功的文件名称。冒号后面的就是整个可执行文件依赖的中间目标文件。

3.3 中间目标文件

以.o结尾的就是中间目标文件。冒号后面跟的是目标文件的依赖文件:.h和.c文件

3.4 生成目标文件的命令

gcc命令表明将中间的目标文件链接起来,最终生成目标可执行文件。须要主要的是,命令行都是在第二行,且以tab键的空格,不然会不生效。

3.5 换行符\

若是一行太长,能够经过符号\来进行换行。

3.6 clean清除操做

clean是动做命令。make clean会清除的目标中间文件.o

4. 执行流程

  1. 当用户敲下make命令时,make工具会去找当前C工程目录下的Makefile或者makefile文件
  2. 找到Makefile这个文件后,它会找到第一个目标文件。而后去当前C工程目录下是否有main这个可执行的文件。而后判断这个可执行文件是不是最新的,若是是最新的,则不须要编译
  3. 若是不存在main这个可执行文件,make命令就会去生成.o中间目标文件,而后生成main可执行文件
  4. 若是main存在,make回去比较中间文件.o文件是否更新,若是是最新的则不须要更新,不是最新的继续往下找依赖,找到有须要更新的目标文件的时候,就会执行编译命令
  5. 整个make的依赖性就是make会一层层去找依赖关系,而且比较是否须要更新,直到编译出最终的可执行目标文件

5. 变量使用

Make file中也可使用变量。变量能够用 o b j e c t (object)这样的方式使用。
使用变量最大的好处就是大大简化了Makefile编写难度,加强了Makefile文件的可维护性

object = get.o sum.o val.o main.o
    main:${object}
        gcc -o main${object}
    main.o:main.c
        gcc -c main.c
    val.o:val.h val.c
        gcc -c val.c
    sum.o:val.h sum.h sum.c
        gcc -c sum.c
    get.o:get.h get.c
        gcc -c get.c
    clean:
        rm -rf *.o

6. make的自动推导功能

object = get.o sum.o val.o main.o
main:${object}
    gcc -o main${object}
main.o:get.h sum.h
val.o:val.h
sum.o:val.h sum.h
get.o:get.h
clean:
    rm -rf *.o

7. include引用其余文件

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息