色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > linux make命令安裝詳解

linux make命令安裝詳解 時間:2018-08-16      來源:未知

對于GNU Make或許很多Windows開發(fā)的程序員并不是很了解,因為Windows中的很多集成開發(fā)環(huán)境(IDE)都幫我們做了這件事。但是作為一個專業(yè)從事Linux嵌入式開發(fā)的程序員就必須要了解GNU Make,會不會使用GNU Make從一定角度上反應了一個人是否具備大型工程能力。本文主要圍繞Make命令展開,介紹Linux下Make的使用以及Makefile的語法和使用Make進行源碼安裝。

一、什么是GNU Make

GNU Make是一個控制從程序的源文件中生成程序的可執(zhí)行文件和其他非源文件的工具。

Make可以從一個名為Makefile的文件中獲得如何構(gòu)建程序的知識,該文件列出了每個非源文件以及如何從其他文件計算它。當你編寫一個程序時,你應該為它編寫一個Makefile文件,這樣就可以使用Make來編譯和安裝這個程序。

二、如何獲取Make

Make可以在GNU的主要FTP服務器上找到:http : //ftp.gnu.org/gnu/make/ (通過HTTP)和 ftp://ftp.gnu.org/gnu/make/ (通過FTP)。它也可以在GNU鏡像列表上找到; 請盡可能GNU的鏡像列表。

三、為什么需要Make

任何一種技能或知識都是源之于某種社會需求,那為什么要用Make呢?當項目源文件很少的時候,我們也許還可以手動使用gcc命令來進行編譯,但是當項目發(fā)展到一個龐大的規(guī)模時,再手動敲gcc命令去編譯就變得不可能的事情。所以呢,在這樣的歷史背景下,就出現(xiàn)了一位大牛(斯圖亞特·費爾德曼),在1977年貝爾實驗室制作了這樣一個軟件,它的名字就叫做Make。所以實際開發(fā)中,我們在編譯大型項目的時候往往會使用Make進行編譯,為此我們還需要了解Make軟件所依賴的Makefile規(guī)則文件。

四、Makefile

Makefile 文件需要按照某種語法進行編寫,文件中需要說明如何編譯各個源文件并連接生成可執(zhí)行文件,并要求定義源文件之間的依賴關系。Makefile的語法還是略微有些復雜,因篇幅有限,本文只能簡述Makefile的編寫原則。

(1)Makefile的組成部分

Makefile包含五個東西:顯示規(guī)則,隱式規(guī)則,變量定義,文件指示,注釋。

<1>顯式規(guī)則,顯式規(guī)則說明了,如何生成一個或多的的目標文件。這是由Makefile的書寫者明顯指出,要生成的文件,文件的依賴文件,生成的命令。

<2>隱式規(guī)則,由于我們的make有自動推導的功能,所以隱晦的規(guī)則可以讓我們比較粗糙地簡略地書寫Makefile,這是由make所支持的。

<3>變量的定義,在Makefile中我們要定義一系列的變量,變量一般都是字符串,這個有點你C語言中的宏,當Makefile被執(zhí)行時,其中的變量都會被擴展到相應的引用位置上。

<4>文件指示,其包括了三個部分,一個是在一個Makefile中引用另一個Makefile,就像C語言中的include一樣;另一個是指根據(jù)某些情況指定Makefile中的有效部分,就像C語言中的預編譯#if一樣;還有就是定義一個多行的命令。有關這一部分的內(nèi)容,我會在后續(xù)的部分中講述。

<5>注釋,Makefile中只有行注釋,和UNIX的Shell腳本一樣,其注釋是用“#”字符,這個就像C/C++中的“//”一樣。如果你要在你的Makefile中使用“#”字符,可以用反斜框進行轉(zhuǎn)義,如:“/#”。

(2) Makefile的規(guī)則

我們先來粗略地看一看Makefile的規(guī)則。

target... : prerequisites ...

command

...

...

target也就是一個目標文件,可以是Object File,也可以是執(zhí)行文件。還可以是一個標簽(Label),對于標簽這種特性,在后續(xù)的“偽目標”章節(jié)中會有敘述。

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

command也就是make需要執(zhí)行的命令。(一定要以Tab鍵作為開頭)

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

(3)Makefile之模式規(guī)則

模式規(guī)則其實也是普通規(guī)則,但它使用了如%這樣的通配符。如下面的例子:
Linux make

此規(guī)則描述了一個.o文件如何由對應的.c文件創(chuàng)建。規(guī)則的命令行中使用了自動化變量“$<”和“$@”,其中自動化變量“$<”代表規(guī)則的依賴,“$@”代表規(guī)則的目標。此規(guī)則在執(zhí)行時,命令行中的自動化變量將根據(jù)實際的目標和依賴文件取對應值。

其含義是,字指出了從所有的.c文件生成相應的.o文件的規(guī)則。如果要生成的目標是”a.o b.o”,那么 %.c”就是”a.c b.c”。

在模式規(guī)則中,目標的定義需要有“%”字符。“%”定義對文件名的匹配,表示任意長度的非空字符串。在依賴目標中同樣可以使用“%”,只是依賴目標中“%”的取值,取決于其目標。

注意:模式規(guī)則中“%”的展開和變量與函數(shù)的展開是有區(qū)別的,“%”的展開發(fā)生在變量和函數(shù)的展開之后。變量和函數(shù)的展開發(fā)生在make載入Makefile時,而“%”的展開則發(fā)生在運行時。

<1> 自動化變量

自動化變量只應出現(xiàn)在規(guī)則的命令中。

變量 含義
$@ 表示規(guī)則中的所有目標文件的集合。在模式規(guī)則中如果有多個目標,“$@”就是匹配于目標中模式定義的集合
$% 僅當目標是函數(shù)庫文件時,表示規(guī)則中的目標成員名,如果目標不是函數(shù)庫文件(UNIX下是.a,Windows是.lib),其值為空。
$< 依賴目標中的第一個目標名字,如果依賴目標是以模式(即”%“)定義的,則”$<”是符合模式的一系列的文件集
$? 所有比目標新的依賴目標的集合,以空格分隔
$^ 所有依賴目標的集合,以空格分隔。如如果在依賴目標中有多個重復的,則自動去除重復的依賴目標,只保留一份
$+ 同”$^”,也是所有依賴目標的集合,只是它不去除重復的依賴目標。
$* 目標模式中“%”及其之前的部分
$(@D) “$@”的目錄部分(不以斜杠作為結(jié)尾),如果”$@”中沒有包含斜杠,其值為“.”(當前目錄)
$(@F) “$@”的文件部分,相當于函數(shù)”$(notdir $@)”
$(*D) 同”$(@D)”,取文件的目錄部分
$(*F) 同”$(@F)”,取文件部分,但不取后綴名
$(%D) 函數(shù)包文件成員的目錄部分
$(%F) 函數(shù)包文件成員的文件名部分
$(<D) 依賴目標中的第一個目標的目錄部分
$(<F) 依賴目標中的第一個目標的文件名部分
$(^D) 所有依賴目標文件中目錄部分(無相同的)
$(^F) 所有依賴目標文件中文件名部分(無相同的)
$(+D) 所有依賴目標文件中的目錄部分(可以有相同的)
$(+F) 所有依賴目標文件中的文件名部分(可以有相同的)
$(?D) 所有被更新文件的目錄部分
$(?F) 所有被更新文件的文件名部分

<2>$VAR和$$VAR的區(qū)別:

makefile文件中的規(guī)則絕大部分都是使用shell命令來實現(xiàn)的,這里就涉及到了變量的使用,包括makefile中的變量和shell命令范疇內(nèi)的變量。在makefile的規(guī)則命令行中使用$var就是在命令中引用makefile的變量,這里僅僅是讀取makefile的變量然后擴展開,將其值作為參數(shù)傳給了一個shell命令;而$$var是在訪問一個shell命令內(nèi)定義的變量,而非makefile的變量。如果某規(guī)則有n個shell命令行構(gòu)成,而相互之間沒有用';'和'\'連接起來的話,就是相互之間沒有關聯(lián)的shell命令,相互之間也不能變量共享。

(4)Makefile之偽目標

使用其原因一:避免和同名文件沖突

在現(xiàn)實中難免存在所定義的目標與所存在的目標是同名的,采用Makefile如何處理這種情況呢?Makefile中的假目標(phony target)可以解決這個問題。

假目標可以使用.PHONY關鍵字進行聲明,對于假目標,可以想象,因為不依賴于某文件,make該目標的時候,其所在規(guī)則的命令都會被執(zhí)行。

如果編寫一個規(guī)則,并不產(chǎn)生目標文件,則其命令在每次make 該目標時都執(zhí)行。

例如:

clean:

rm *.o temp

因為"rm"命令并不產(chǎn)生"clean"文件,則每次執(zhí)行"make clean"的時候,該命令都會執(zhí)行。如果目錄中出現(xiàn)了"clean"文件,則規(guī)則失效了:沒有依賴文件,文件"clean"始終是新的,命令永遠不會執(zhí)行;為避免這個問題,可使用".PHONY"指明該目標。如:

.PHONY : clean

這樣執(zhí)行"make clean"會無視"clean"文件存在與否。

已知phony 目標并非是由其它文件生成的實際文件,make 會跳過隱含規(guī)則搜索。這就是聲明phony 目標會改善性能的原因,即使你并不擔心實際文件存在與否。

完整的例子如下:

.PHONY : clean

clean :

rm *.o temp

使用其原因二:提高執(zhí)行make的效率

當一個目標被聲明為偽目標后,make在執(zhí)行此規(guī)則時不會試圖去查找隱含規(guī)則來創(chuàng)建這個目標。這樣也提高了make的執(zhí)行效率,同時我們也不用擔心由于目標和文件名重名而使我們的期望失敗。

(5)Makefile的賦值

[=]和[:=]符號的區(qū)別。

=

可以先使用后定義,這就導致makefile在全部展開后才能決定變量的值。

有可能出現(xiàn)循環(huán)遞歸,無法暫開的問題。

:=

必須先定義然后再使用,在當前的位置就可以決定變量的值。

?=

相當于選擇疑問句,如果前面的變量沒被賦值,那就做賦值操作

+=

相當于遞加操作

(6)Makefile之執(zhí)行過程

1. 依次讀取變量“MAKEFILES”定義的makefile文件列表

2. 讀取工作目錄下的makefile文件(根據(jù)命名的查找順序“GNUmakefile”,“makefile”,“Makefile”,首先找到那個就讀取那個)

3. 依次讀取工作目錄makefile文件中使用指示符“include”包含的文件

4. 查找重建所有已讀取的makefile文件的規(guī)則(如果存在一個目標是當前讀取的某一個makefile文件,則執(zhí)行此規(guī)則重建此makefile文件,完成以后從第一步開始重新執(zhí)行)

5. 初始化變量值并展開那些需要立即展開的變量和函數(shù)并根據(jù)預設條件確定執(zhí)行分支

6. 根據(jù)“終極目標”以及其他目標的依賴關系建立依賴關系鏈表

7. 執(zhí)行除“終極目標”以外的所有的目標的規(guī)則(規(guī)則中如果依賴文件中任一個文件的時間戳比目標文件新,則使用規(guī)則所定義的命令重建目標文件)

8. 執(zhí)行“終極目標”所在的規(guī)則

五、使用Make進行源碼安裝

(1)正常的編譯安裝/卸載:

源碼的安裝一般由3個步驟組成:配置(configure)、編譯(make)、安裝(make install)。

configure文件是一個可執(zhí)行的腳本文件,它有很多選項,在待安裝的源碼目錄下使用命令./configure –help可以輸出詳細的選項列表。

其中--prefix選項是配置安裝目錄,如果不配置該選項,安裝后可執(zhí)行文件默認放在/usr /local/bin,庫文件默認放在/usr/local/lib,配置文件默認放在/usr/local/etc,其它的資源文件放在/usr /local/share,比較凌亂。

如果配置了--prefix,如:

$ ./configure --prefix=/usr/local/test

安裝后的所有資源文件都會被放在/usr/local/test目錄中,不會分散到其他目錄。

使用--prefix選項的另一個好處是方便卸載軟件或移植軟件;當某個安裝的軟件不再需要時,只須簡單的刪除該安裝目錄,就可以把軟件卸載得干干凈凈;而移植軟件只需拷貝整個目錄到另外一個機器即可(相同的操作系統(tǒng)下)。

當然要卸載程序,也可以在原來的make目錄下用一次make uninstall,但前提是Makefile文件有uninstall命令(nodejs的源碼包里有uninstall命令,測試版本v0.10.35)。

(2)卸載:

如果沒有配置--prefix選項,源碼包也沒有提供make uninstall,則可以通過以下方式可以完整卸載:

找一個臨時目錄重新安裝一遍,如:

$ ./configure --prefix=/tmp/to_remove && make install

然后遍歷/tmp/to_remove的文件,刪除對應安裝位置的文件即可(因為/tmp/to_remove里的目錄結(jié)構(gòu)就是沒有配置--prefix選項時的目錄結(jié)構(gòu))。

當下載了源碼就可以按照此種方法,就可以進行軟件的安裝和卸載。

六、總結(jié)

關于Makefile的用法,我們今天就討論到這里,對于一個Linux程序員來說Makefile的作用和重要。對于程序的編譯以及程序員對項目的了解有很大的幫助。

上一篇:大型程序管理神器之CMake

下一篇:Android串口調(diào)試助手實現(xiàn)

熱點文章推薦
華清學員就業(yè)榜單
高薪學員經(jīng)驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權(quán)所有 ,京ICP備16055225號-5京公海網(wǎng)安備11010802025203號

回到頂部

主站蜘蛛池模板: 国产十一区| 亚洲精品天堂成人片AV在线播放 | 性色AV片蜜臂 | 欧美乱码卡1卡2卡三卡四卡 | 2828无码高潮毛片 | 无码一区二区三区av免费 | 日日骚一区二区 | 亚洲精品一区二区三区福利 | 欧美成免费A级毛片 | 亚洲一区二区经典在线播放 | 国产成人免费ā片在线观看 | 午夜免费观看福利片 | 美女午夜福利4K视频在线观看 | 欧美日产亚洲国产精品 | 人妻熟妇乱又伦精品视频中文字幕 | 人摸人人人澡人人超碰97 | 乱子轮熟睡1区 | 麻豆宣传片| 亚洲精品久久无码2021 | 国产手机在线精品 | 久久99精品久久久久久久清纯 | 国产AV亚洲精品久久久久久小说 | 无码AV中文一二三区 | 国产精品久久久午夜夜伦鲁鲁 | 欧美经典一区二区三区 | 亚洲人成网7777777国产 | 99久久精品国产免费 | 国产无遮挡A片又黄又爽网站 | 午夜九九 | 熟妇与小伙子matur老熟妇e | 国产乱妇乱子在线播放视频 | 日韩国产一区二区三区四区五区 | AV无码中文字幕不卡一区二区三区 | 国产亚洲精品久久久久久豆腐 | 在线看片免费人成视频无毒 | "www 久久久" | 天天爽夜夜爽夜夜爽精品视频 | 亚洲国产精品无码久久青草 | 天堂AV旡码AV在线A2020V | 日本XXXX色视频在线观看免费, | 免费a级毛片无码a∨ |