zoukankan      html  css  js  c++  java
  • Linux-C-Program:makefile

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

    1. 概述

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

    2. 示例说明

    创建项目如下:
    val.h和val.c
    val.h

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

    val.c

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

    get.h和get.c
    get.h

        #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.h

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

    sum.c

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

    main.c

        #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
    ",z);
            x = 20;
            z = get(&x,&y);
            printf("z:%d
    ",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.o

    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中也可以使用变量。变量可以用object(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引用其他文件

  • 相关阅读:
    python 线程队列、线程池、全局解释器锁GIL
    java Cookie 获取历史记录列表(三)
    Java中如何读写cookie (二)
    java读取和写入浏览器Cookies
    zookeeper的安装和部署
    Spring Boot 多模块项目创建与配置 (一)
    十款效果惊艳的Html案例(一)
    phython
    阿里高并发所用到的技术
    Java9新特性
  • 原文地址:https://www.cnblogs.com/liwanliangblog/p/9265330.html
Copyright © 2011-2022 走看看