shell腳本編程Makefile的使用

為什麼要使用Makefile

簡單來說,當我們寫一個稍微大一些項目的時候,如果我們要執行一個程序那得編譯很多個文件並且還得鏈接起來,如果沒有Makefile我們就得一個一個編譯一個一個鏈接那真的是又臭又長(而且還會經常寫錯),而Makefile就能夠很好的解決這個問題,所以說掌握好Makefile的編寫是很有必要的

Makefile的編寫

程序的編譯和鏈接

使用C、C++編寫可執行程序,首先要把源文件編譯成中間代碼文件,Linux下是 .o 文件,即 Object File,這個動作叫做編譯(compile)。然後再把大量的Object File合成執行文件,這個動作叫作鏈接(link)。

一個項目,擁有成百上千的源程序文件,編譯鏈接這些源文件都是由規則的,Makefile閃亮登場!Makefile確定整個工程的編譯規則,隻需要一個make命令,就可以實現“自動化編譯”。make是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。

Make 工作原理

通常在一個項目裡,我們的規則是:
1)如果這個工程沒有編譯過,那麼我們的所有C文件都要編譯並被鏈接。
2)如果這個工程的某幾個C文件被修改,那麼我們隻編譯被修改的C文件,並鏈接目標程序。
3)如果這個工程的頭文件被改變瞭,那麼我們需要編譯引用瞭這幾個頭文件的C文件,並鏈接目標程序。

其實就是智能的識別哪些編譯鏈接需要做,哪些不用做避免不必要的時間消耗

隻要我們的Makefile寫得夠好,我們隻用一個make命令就可以完成,make命令會自動智能地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。

Makefile的規則

target … : prerequisites …

command

target:也就是一個目標文件,可以是ObjectFile,也可以是執行文件。還可以是一個標簽(Label),對於標簽這種特性,暫不敘述。

prerequisites:要生成那個target所需要的文件或是目標。

command:也就是make需要執行的命令。(任意的Shell命令)

這是一個文件的依賴關系,也就是說,target這一個或多個的目標文件依賴於prerequisites中的文件,其生成規則定義在command中。說白一點就是說,prerequisites中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執行。這就是Makefile的規則。也就是Makefile中最核心的內容。

一個范例:

hello_demo : hellospeak.o speak.o   //由hellospeak.o speak.o鏈接成目標hello_demo                                  
        gcc -o hello_demo hellospeak.o speak.o  //執行下面的命令                               

hellospeak.o : hellospeak.c speak.h  //如果一些hellospeak.c的函數聲明是在頭文件speak.h中那麼也得在這後面加上                                         
        gcc -c hellospeak.c                                                
speak.o : speak.c  speak.h                                                  
        gcc -c speak.c                                                    
clean :                                                                  
        rm hello_demo speak.o  hellospeak.o  //當執行make clean時就會執行這個語句 

下面是我寫的整體例子

//speak.h
#include<stdio.h>
#include<stdlib.h>
void helloSpeak();
--------------------------------------------------------------




//speak.c
#include"speak.h"
void helloSpeak()
{
 printf("Hello Makefile\n");
}
--------------------------------------------------------------




//main.c
#include"speak.h"
int main()
{
  helloSpeak();
  return 0;
}



--------------------------------------------------------------
//Makefile
Hello: main.o speak.o
        gcc -o Hello  main.o speak.o
main.o: main.c speak.h
        gcc -c main.c
speak.o: speak.c speak.h
        gcc -c speak.c
clean:
        rm Hello speak.o main.o

~

運行效果👇

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

 到此這篇關於shell腳本編程Makefile的使用的文章就介紹到這瞭,更多相關shell Makefile內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: