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引用其餘文件

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息