shell腳本編程Makefile的使用
為什么要使用Makefile
簡(jiǎn)單來(lái)說(shuō),當(dāng)我們寫(xiě)一個(gè)稍微大一些項(xiàng)目的時(shí)候,如果我們要執(zhí)行一個(gè)程序那得編譯很多個(gè)文件并且還得鏈接起來(lái),如果沒(méi)有Makefile我們就得一個(gè)一個(gè)編譯一個(gè)一個(gè)鏈接那真的是又臭又長(zhǎng)(而且還會(huì)經(jīng)常寫(xiě)錯(cuò)),而Makefile就能夠很好的解決這個(gè)問(wèn)題,所以說(shuō)掌握好Makefile的編寫(xiě)是很有必要的
Makefile的編寫(xiě)
程序的編譯和鏈接
使用C、C++編寫(xiě)可執(zhí)行程序,首先要把源文件編譯成中間代碼文件,Linux下是 .o 文件,即 Object File,這個(gè)動(dòng)作叫做編譯(compile)。然后再把大量的Object File合成執(zhí)行文件,這個(gè)動(dòng)作叫作鏈接(link)。
一個(gè)項(xiàng)目,擁有成百上千的源程序文件,編譯鏈接這些源文件都是由規(guī)則的,Makefile閃亮登場(chǎng)!Makefile確定整個(gè)工程的編譯規(guī)則,只需要一個(gè)make命令,就可以實(shí)現(xiàn)“自動(dòng)化編譯”。make是一個(gè)解釋makefile中指令的命令工具,一般來(lái)說(shuō),大多數(shù)的IDE都有這個(gè)命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。
Make 工作原理
通常在一個(gè)項(xiàng)目里,我們的規(guī)則是:
1)如果這個(gè)工程沒(méi)有編譯過(guò),那么我們的所有C文件都要編譯并被鏈接。
2)如果這個(gè)工程的某幾個(gè)C文件被修改,那么我們只編譯被修改的C文件,并鏈接目標(biāo)程序。
3)如果這個(gè)工程的頭文件被改變了,那么我們需要編譯引用了這幾個(gè)頭文件的C文件,并鏈接目標(biāo)程序。
其實(shí)就是智能的識(shí)別哪些編譯鏈接需要做,哪些不用做避免不必要的時(shí)間消耗
只要我們的Makefile寫(xiě)得夠好,我們只用一個(gè)make命令就可以完成,make命令會(huì)自動(dòng)智能地根據(jù)當(dāng)前的文件修改的情況來(lái)確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標(biāo)程序。
Makefile的規(guī)則
target … : prerequisites …
command
…
…target:也就是一個(gè)目標(biāo)文件,可以是ObjectFile,也可以是執(zhí)行文件。還可以是一個(gè)標(biāo)簽(Label),對(duì)于標(biāo)簽這種特性,暫不敘述。
prerequisites:要生成那個(gè)target所需要的文件或是目標(biāo)。
command:也就是make需要執(zhí)行的命令。(任意的Shell命令)
這是一個(gè)文件的依賴(lài)關(guān)系,也就是說(shuō),target這一個(gè)或多個(gè)的目標(biāo)文件依賴(lài)于prerequisites中的文件,其生成規(guī)則定義在command中。說(shuō)白一點(diǎn)就是說(shuō),prerequisites中如果有一個(gè)以上的文件比target文件要新的話(huà),command所定義的命令就會(huì)被執(zhí)行。這就是Makefile的規(guī)則。也就是Makefile中最核心的內(nèi)容。
一個(gè)范例:
hello_demo : hellospeak.o speak.o //由hellospeak.o speak.o鏈接成目標(biāo)hello_demo gcc -o hello_demo hellospeak.o speak.o //執(zhí)行下面的命令 hellospeak.o : hellospeak.c speak.h //如果一些hellospeak.c的函數(shù)聲明是在頭文件speak.h中那么也得在這后面加上 gcc -c hellospeak.c speak.o : speak.c speak.h gcc -c speak.c clean : rm hello_demo speak.o hellospeak.o //當(dāng)執(zhí)行make clean時(shí)就會(huì)執(zhí)行這個(gè)語(yǔ)句
下面是我寫(xiě)的整體例子
//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 ~
運(yùn)行效果??
到此這篇關(guān)于shell腳本編程Makefile的使用的文章就介紹到這了,更多相關(guān)shell Makefile內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
shell腳本結(jié)合iptables防端口掃描的實(shí)現(xiàn)
這篇文章主要介紹了shell腳本結(jié)合iptables防端口掃描的實(shí)現(xiàn),中間使用了inotify-tools工具,需要的朋友可以參考下2014-05-05讓代碼整潔、過(guò)程清晰的BASH Shell編程技巧
這篇文章主要介紹了讓代碼整潔、過(guò)程清晰的BASH Shell編程技巧,特別是大型的Shell項(xiàng)目中,這10個(gè)經(jīng)驗(yàn)之談可以幫助你寫(xiě)出代碼整潔、過(guò)程清晰的代碼,需要的朋友可以參考下2014-07-07linux awk時(shí)間計(jì)算腳本及awk命令詳解
這篇文章主要介紹了linux awk時(shí)間計(jì)算腳本及awk命令詳解的相關(guān)資料,需要的朋友可以參考下2015-11-11Shell $[]對(duì)整數(shù)進(jìn)行數(shù)學(xué)運(yùn)算實(shí)現(xiàn)
本文主要介紹了Shell $[]對(duì)整數(shù)進(jìn)行數(shù)學(xué)運(yùn)算實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01ssh,scp自動(dòng)登陸的實(shí)現(xiàn)方法
這篇文章主要介紹ssh,scp自動(dòng)登陸的實(shí)現(xiàn)方法,需要的朋友可以參考下2013-02-02Linux命令行循環(huán)執(zhí)行shell命令
這篇文章主要介紹了Linux命令行,循環(huán)執(zhí)行shell命令的相關(guān)知識(shí),主要包括死循環(huán),普通計(jì)數(shù)循環(huán),以及Linux shell循環(huán)命令 while死循環(huán)的用法,需要的朋友可以參考下2023-01-01