導航:首頁 > 程序命令 > make命令是干什麼用的

make命令是干什麼用的

發布時間:2023-07-29 01:02:14

linux make命令什麼意思

無論是在Linux還是在Unix環境中,make都是一個非常重要的編譯命令。不管是自己進行項目開發還是安裝應用軟體,我們都經常要用到
make或make
install。利用make工具,我們可以將大型的開發項目分解成為多個更易於管理的模塊,對於一個包括幾百個源文件的應用程序,使用make和
makefile工具就可以簡潔明快地理順各個源文件之間紛繁復雜的相互關系。而且如此多的源文件,如果每次都要鍵入gcc命令進行編譯的話,那對程序員
來說簡直就是一場災難。而make工具則可自動完成編譯工作,並且可以只對程序員在上次編譯後修改過的部分進行編譯。因此,有效的利用make和
makefile工具可以大大提高項目開發的效率。同時掌握make和makefile之後,您也不會再面對著Linux下的應用軟體手足無措了。
但令人遺憾的是,在許多講述Linux應用的書籍上都沒有詳細介紹這個功能強大但又非常復雜的編譯工具。在這里我就向大家詳細介紹一下make及其描述文件
makefile。
Makefile文件
Make工具最主要也是最基本的功能就是通過makefile文件來描述源程序之間的相互關系並自動維護編譯工作。而makefile 文件需要按照某種語法進行編寫,文件

需要說明如何編譯各個源文件並連接生成可執行文件,並要求定義源文件之間的依賴關系。makefile 文件是許多編譯器--包括 Windows NT
下的編譯器--維護編譯信息的常用方法,只是在集成開發環境中,用戶通過友好的界面修改 makefile 文件而已。

在 UNIX 系統中,習慣使用 Makefile 作為 makfile 文件。如果要使用其他文件作為 makefile,則可利用類似下面的 make 命令選項指定 makefile 文件:

$ make -f Makefile.debug

例如,一個名為prog的程序由三個C源文件filea.c、fileb.c和filec.c以及庫文件LS編譯生成,這三個文件還分別包含自
己的頭文件a.h
、b.h和c.h。通常情況下,C編譯器將會輸出三個目標文件filea.o、fileb.o和filec.o。假設filea.c和fileb.c都要
聲明用到一個名為defs的文件,但filec.c不用。即在filea.c和fileb.c里都有這樣的聲明:

#include "defs"

那麼下面的文檔就描述了這些文件之間的相互聯系:

#It is a example for describing makefile
prog : filea.o fileb.o filec.o
cc filea.o fileb.o filec.o -LS -o prog
filea.o : filea.c a.h defs
cc -c filea.c
fileb.o : fileb.c b.h defs
cc -c fileb.c
filec.o : filec.c c.h
cc -c filec.c

這個描述文檔就是一個簡單的makefile文件。

從上面的例子注意到,第一個字元為 # 的行為注釋行。第一個非注釋行指定prog由三個目標文件filea.o、fileb.o和filec.o鏈接生成。第三行描述了如何從prog所依賴的文件建立可執行文件。接下來的4、6、8行分別指定三個目標文件,以及它們所依賴的.c和.h文件以及defs文件。而5、7、9行則指定了如何從目標所依賴的文
件建立目標。

當filea.c或a.h文件在編譯之後又被修改,則 make 工具可自動重新編譯filea.o,如果在前後兩次編譯之間,filea.C 和a.h 均沒有被修改,而且 test.o 還存在的話,就沒有必要重新編譯。這種依賴關系在多源文件的程序編譯中尤其重要。通過這種依賴關系的定義,make 工具可避免許多不必要的編譯工作。當然,利用 Shell
腳本也可以達到自動編譯的效果,但是,Shell 腳本將全部編譯任何源文件,包括哪些不必要重新編譯的源文件,而 make 工具則可根據目標上一次編譯的時間和目標所依賴的源文件的更新時間而自動判斷應當編譯哪個源文件。

Makefile文件作為一種描述文檔一般需要包含以下內容:
◆ 宏定義
◆ 源文件之間的相互依賴關系
◆ 可執行的命令

Makefile中允許使用簡單的宏指代源文件及其相關編譯信息,在Linux中也稱宏為變數。在引用宏時只需在變數前加$符號,但值得注意的是,如果變數名的長度超過一個字元,在引用時就必須加圓括弧()。下面都是有效的宏引用:

$(CFLAGS)
$2
$Z
$(Z)

其中最後兩個引用是完全一致的。需要注意的是一些宏的預定義變數,在Unix系統中,$*、$@、$?和$<四個特殊宏的值在執行命令的過程中會發生相應的變化,而在GNU make中則定義了更多的預定義變數。關於預定義變數的詳細內容,宏定義的使用可以使我們脫離那些冗長乏味的編譯選項,為編寫makefile文
件帶來很大的方便。

# Define a macro for the object files
OBJECTS= filea.o fileb.o filec.o
# Define a macro for the library file
LIBES= -LS
# use macros rewrite makefile
prog: $(OBJECTS)
cc $(OBJECTS) $(LIBES) -o prog
……

此時如果執行不帶參數的make命令,將連接三個目標文件和庫文件LS;但是如果在make命令後帶有新的宏定義:

make "LIBES= -LL -LS"

則命令行後面的宏定義將覆蓋makefile文件中的宏定義。若LL也是庫文件,此時make命令將連接三個目標文件以及兩個庫文件LS和LL。

在Unix系統中沒有對常量NULL作出明確的定義,因此我們要定義NULL字元串時要使用下述宏定義:

STRINGNAME=

Make命令
在make命令後不僅可以出現宏定義,還可以跟其他命令行參數,這些參數指定了需要編譯的目標文件。其標准形式為:

target1 [target2 …]:[:][dependent1 …][;commands][#…]
[(tab) commands][#…]

方括弧中間的部分表示可選項。Targets和dependents當中可以包含字元、數字、句點和"/"符號。除了引用,commands中不能含有"#",也不允許換行。
在通常的情況下命令行參數中只含有一個":",此時command序列通常和makefile文件中某些定義文件間依賴關系的描述行有關。如果與目標相關連的那些描述行指定了相關的command序列,那麼就執行這些相關的command命令,即使在分號和(tab)後面的aommand欄位甚至有可能是NULL。如果那些與目標相關連的行沒有指定command,那麼將調用系統默認的目標文件生成規則。
如果命令行參數中含有兩個冒號"::",則此時的command序列也許會和makefile中所有描述文件依賴關系的行有關。此時將執行那些與目標相關連的描述行所
指向的相關命令。同時還將執行build-in規則。
如果在執行command命令時返回了一個非"0"的出錯信號,例如makefile文件中出現了錯誤的目標文件名或者出現了以連字元打頭的命令字元串,make操作一般會就此終止,但如果make後帶有"-i"參數,則make將忽略此類出錯信號。
Make命本身可帶有四種參數:標志、宏定義、描述文件名和目標文件名。其標准形式為:

Make [flags] [macro definitions] [targets]

Unix系統下標志位flags選項及其含義為:
-f file 指定file文件為描述文件,如果file參數為"-"符,那麼描述文件指向標准輸入。如果沒有"-f"參數,則系統將默認當前目錄下名為makefile或者名為Makefile的文件為描述文件。在Linux中, GNU make 工具在當前工作目錄中按照GNUmakefile、makefile、Makefile的順序搜索 makefile文件。
-i 忽略命令執行返回的出錯信息。
-s 沉默模式,在執行之前不輸出相應的命令行信息。

-r 禁止使用build-in規則。

-n 非執行模式,輸出所有執行命令,但並不執行。

-t 更新目標文件。
-q make操作將根據目標文件是否已經更新返回"0"或非"0"的狀態信息。
-p 輸出所有宏定義和目標文件描述。
-d Debug模式,輸出有關文件和檢測時間的詳細信息。
Linux下make標志位的常用選項與Unix系統中稍有不同,下面我們只列出了不同部分:
-c dir 在讀取 makefile 之前改變到指定的目錄dir。
-I dir 當包含其他 makefile文件時,利用該選項指定搜索目錄。
-h help文擋,顯示所有的make選項。
-w 在處理 makefile 之前和之後,都顯示工作目錄。
通過命令行參數中的target ,可指定make要編譯的目標,並且允許同時定義編譯多個目標,操作時按照從左向右的順序依次編譯target選項中指定的目標文件。如果命令行中沒有指定目標,則系統默認target指向描述文件中第一個目標文件。

通常,makefile 中還定義有 clean 目標,可用來清除編譯過程中的中間文件,例如:

clean:
rm -f *.o

運行 make clean 時,將執行 rm -f *.o 命令,最終刪除所有編譯過程中產生的所有中間文件。
隱含規則
在make 工具中包含有一些內置的或隱含的規則,這些規則定義了如何從不同的依賴文件建立特定類型的目標。Unix系統通常支持一種基於文件擴展名即文件名後綴的隱含規則。這種後綴規則定義了如何將一個具有特定文件名後綴的文件(例如.c文件),轉換成為具有另一種文件名後綴的文件(例如.o文件):

.c:.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<

系統中默認的常用文件擴展名及其含義為:
.o 目標文件
.c C源文件
.f FORTRAN源文件
.s 匯編源文件
.y Yacc-C源語法
.l Lex源語法
在早期的Unix系統系統中還支持Yacc-C源語法和Lex源語法。在編譯過程中,系統會首先在makefile文件中尋找與目標文件相關的.C文件,如果還有與之相依賴的.y和.l文件,則首先將其轉換為.c文件後再編譯生成相應的.o文件;如果沒有與目標相關的.c文件而只有相關的.y文件,則系統將直接編譯.y文件。
而GNU make 除了支持後綴規則外還支持另一種類型的隱含規則--模式規則。這種規則更加通用,因為可以利用模式規則定義更加復雜的依賴性規則。模式規則看起來非常類似於正則規則,但在目標名稱的前面多了一個 % 號,同時可用來定義目標和依賴文件之間的關系,例如下面的模式規則定義了如何將任意一個 file.c 文件轉換為 file.o 文件:

%.c:%.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
#EXAMPLE#

下面將給出一個較為全面的示例來對makefile文件和make命令的執行進行進一步的說明,其中make命令不僅涉及到了C源文件還包括了Yacc語法。本例選自"Unix
Programmer's Manual 7th Edition, Volume 2A" Page 283-284
下面是描述文件的具體內容:

#Description file for the Make command
#Send to print
P=und -3 | opr -r2
#The source files that are needed by object files
FILES= Makefile version.c defs main.c donamc.c misc.c file.c \
dosys.c gram.y lex.c gcos.c
#The definitions of object files
OBJECTS= vesion.o main.o donamc.o misc.o file.o dosys.o gram.o
LIBES= -LS
LINT= lnit -p
CFLAGS= -O
make: $(OBJECTS)
cc $(CFLAGS) $(OBJECTS) $(LIBES) -o make
size make
$(OBJECTS): defs
gram.o: lex.c
cleanup:
-rm *.o gram.c
install:
@size make /usr/bin/make
cp make /usr/bin/make ; rm make
#print recently changed files
print: $(FILES)
pr $? | $P
touch print
test:
make -dp | grep -v TIME>1zap
/usr/bin/make -dp | grep -v TIME>2zap
diff 1zap 2zap
rm 1zap 2zap
lint: dosys.c donamc.c file.c main.c misc.c version.c gram.c
$(LINT) dosys.c donamc.c file.c main.c misc.c version.c \
gram.c
rm gram.c
arch:
ar uv /sys/source/s2/make.a $(FILES)

通常在描述文件中應象上面一樣定義要求輸出將要執行的命令。在執行了make命令之後,輸出結果為:

$ make
cc -c version.c
cc -c main.c
cc -c donamc.c
cc -c misc.c
cc -c file.c
cc -c dosys.c
yacc gram.y
mv y.tab.c gram.c
cc -c gram.c
cc version.o main.o donamc.o misc.o file.o dosys.o gram.o \
-LS -o make
13188+3348+3044=19580b=046174b

最後的數字信息是執行"@size make"命令的輸出結果。之所以只有輸出結果而沒有相應的命令行,是因為"@size make"命令以"@"起始,這個符號禁止列印輸出它所在的命令行。

描述文件中的最後幾條命令行在維護編譯信息方面非常有用。其中"print"命令行的作用是列印輸出在執行過上次"make print"命令後所有改動過的文件名稱。系
統使用一個名為print的0位元組文件來確定執行print命令的具體時間,而宏$?則指向那些在print文件改動過之後進行修改的文件的文件名。如果想要指定執行print命令後,將輸出結果送入某個指定的文件,那麼就可修改P的宏定義:

make print "P= cat>zap"

在Linux中大多數軟體提供的是源代碼,而不是現成的可執行文件,這就要求用戶根據自己系統的實際情況和自身的需要來配置、編譯源程序後,軟體才能使用。只有掌握了make工具,才能讓我們真正享受到到Linux這個自由軟體世界的帶給我們無窮樂趣。
本回答由電腦網路分類達人 李孝忠推薦

⑵ Makefile入門(八):make運行

一般來說,最簡單的就是直接在命令行下輸入make命令,make命令會找當前目錄的makefile來執行,一切都是自動的。但也有時你也許只想讓make重編譯某些文件,而不是整個工程,而又有的時候你有幾套編譯規則,你想在不同的時候使用不同的編譯規則,等等。本章節就是講述如何使用 make命令的。

make命令執行後有三個退出碼:

0 —— 表示成功執行。

1 —— 如果make運行時出現任何錯誤,其返回1。

2 —— 如果你使用了make的「-q」選項,並且make使得一些目標不需要更新,那麼返回2。

Make的相關參數我們會在後續章節中講述。

前面我們說過,GNU make找尋默認的Makefile的規則是在當前目錄下依次找三個文件——「GNUmakefile」、「makefile」和「Makefile」。其按順序找這三個文件,一旦找到,就開始讀取這個文件並執行。

當然,我們也可以給make命令指定一個特殊名字的Makefile。要達到這個功能,我們要使用make的「-f」或是「--file」參數(「--makefile」參數也行)。例如,我們有個makefile的名字是「hchen.mk」,那麼,我們可以這樣來讓make來執行這個文件:

make –f hchen.mk

如果在make的命令行是,你不只一次地使用了「-f」參數,那麼,所有指定的makefile將會被連在一起傳遞給make執行。

一般來說,make的最終目標是makefile中的第一個目標,而其它目標一般是由這個目標連帶出來的。這是make的默認行為。當然,一般來說,你的makefile中的第一個目標是由許多個目標組成,你可以指示make,讓其完成你所指定的目標。要達到這一目的很簡單,需在make命令後直接跟目標的名字就可以完成(如前面提到的「make clean」形式)

任何在makefile中的目標都可以被指定成終極目標,但是除了以「-」打頭,或是包含了「=」的目標,因為有這些字元的目標,會被解析成命令行參數或是變數。甚至沒有被我們明確寫出來的目標也可以成為make的終極目標,也就是說,只要make可以找到其隱含規則推導規則,那麼這個隱含目標同樣可以被指定成終極目標。

有一個make的環境變數叫「MAKECMDGOALS」,這個變數中會存放你所指定的終極目標的列表,如果在命令行上,你沒有指定目標,那麼,這個變數是空值。這個變數可以讓你使用在一些比較特殊的情形下。比如下面的例子:

基於上面的這個例子,只要我們輸入的命令不是「make clean」,那麼makefile會自動包含「foo.d」和「bar.d」這兩個makefile。

使用指定終極目標的方法可以很方便地讓我們編譯我們的程序,例如下面這個例子:

從這個例子中,我們可以看到,這個makefile中有四個需要編譯的程序——「prog1」, 「prog2」, 「prog3」和 「prog4」,我們可以使用「make all」命令來編譯所有的目標(如果把all置成第一個目標,那麼只需執行「make」),我們也可以使用 「make prog2」來單獨編譯目標「prog2」。

即然make可以指定所有makefile中的目標,那麼也包括「偽目標」,於是我們可以根據這種性質來讓我們的makefile根據指定的不同的目標來完成不同的事。在Unix世界中,軟體發布時,特別是GNU這種開源軟體的發布時,其makefile都包含了編譯、安裝、打包等功能。我們可以參照這種規則來書寫我們的makefile中的目標。

<dl style="font-size: 12.6667px; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">

<dt>「all」</dt>

<dd>這個偽目標是所有目標的目標,其功能一般是編譯所有的目標。</dd>

<dt>clean」</dt>

<dd>這個偽目標功能是刪除所有被make創建的文件。</dd>

<dt>「install」</dt>

<dd>這個偽目標功能是安裝已編譯好的程序,其實就是把目標執行文件拷貝到指定的目標中去。</dd>

<dt>print」</dt>

<dd>這個偽目標的功能是例出改變過的源文件。</dd>

<dt>「tar」</dt>

<dd>這個偽目標功能是把源程序打包備份。也就是一個tar文件。</dd>

<dt>「dist」</dt>

<dd>這個偽目標功能是創建一個壓縮文件,一般是把tar文件壓成Z文件。或是gz文件。</dd>

<dt>TAGS」</dt>

<dd>這個偽目標功能是更新所有的目標,以備完整地重編譯使用。</dd>

<dt>「check」和「test」</dt>

<dd>這兩個偽目標一般用來測試makefile的流程。</dd>

</dl>

當然一個項目的makefile中也不一定要書寫這樣的目標,這些東西都是GNU的東西,但是我想,GNU搞出這些東西一定有其可取之處(等你的 UNIX下的程序文件一多時你就會發現這些功能很有用了),這里只不過是說明了,如果你要書寫這種功能,最好使用這種名字命名你的目標,這樣規范一些,規范的好處就是——不用解釋,大家都明白。而且如果你的makefile中有這些功能,一是很實用,二是可以顯得你的makefile很專業(不是那種初學者的作品)。

有時候,我們不想讓我們的makefile中的規則執行起來,我們只想檢查一下我們的命令,或是執行的序列。於是我們可以使用make命令的下述參數:

「-n」 「--just-print」 「--dry-run」 「--recon」 不執行參數,這些參數只是列印命令,不管目標是否更新,把規則和連帶規則下的命令列印出來,但不執行,這些參數對於我們調試makefile很有用處。

「-t」 「--touch」 這個參數的意思就是把目標文件的時間更新,但不更改目標文件。也就是說,make假裝編譯目標,但不是真正的編譯目標,只是把目標變成已編譯過的狀態。

「-q」 「--question」 這個參數的行為是找目標的意思,也就是說,如果目標存在,那麼其什麼也不會輸出,當然也不會執行編譯,如果目標不存在,其會列印出一條出錯信息。

「-W <file>;」 「--what-if=<file>;」 「--assume-new=<file>;」 「--new-file=<file>;」 這個參數需要指定一個文件。一般是是源文件(或依賴文件),Make會根據規則推導來運行依賴於這個文件的命令,一般來說,可以和「-n」參數一同使用,來查看這個依賴文件所發生的規則命令。

另外一個很有意思的用法是結合「-p」和「-v」來輸出makefile被執行時的信息(這個將在後面講述)。

下面列舉了所有GNU make 3.80版的參數定義。其它版本和產商的make大同小異,不過其它產商的make的具體參數還是請參考各自的產品文檔。

「-b」 「-m」 這兩個參數的作用是忽略和其它版本make的兼容性。

「-B」 「--always-make」 認為所有的目標都需要更新(重編譯)。

「-C <dir>」 「--directory=<dir>」 指定讀取makefile的目錄。如果有多個「-C」參數,make的解釋是後面的路徑以前面的作為相對路徑,並以最後的目錄作為被指定目錄。如:「make –C ~hchen/test –C prog」等價於「make –C ~hchen/test/prog」。

「—debug[=<options>]」 輸出make的調試信息。它有幾種不同的級別可供選擇,如果沒有參數,那就是輸出最簡單的調試信息。下面是<options>的取值:

a —— 也就是all,輸出所有的調試信息。(會非常的多)

b —— 也就是basic,只輸出簡單的調試信息。即輸出不需要重編譯的目標。

v —— 也就是verbose,在b選項的級別之上。輸出的信息包括哪個makefile被解析,不需要被重編譯的依賴文件(或是依賴目標)等。

i —— 也就是implicit,輸出所有的隱含規則。

j —— 也就是jobs,輸出執行規則中命令的詳細信息,如命令的PID、返回碼等。

m —— 也就是makefile,輸出make讀取makefile,更新makefile,執行makefile的信息。

「-d」 相當於「--debug=a」。

「-e」 「--environment-overrides」 指明環境變數的值覆蓋makefile中定義的變數的值。

「-f=<file>」 「--file=<file>」 「--makefile=<file>」 指定需要執行的makefile。

「-h」 「--help」 顯示幫助信息。

「-i」 「--ignore-errors」 在執行時忽略所有的錯誤。

「-I <dir>」 「--include-dir=<dir>」 指定一個被包含makefile的搜索目標。可以使用多個「-I」參數來指定多個目錄。

「-j [<jobsnum>]」 「--jobs[=<jobsnum>]」 指同時運行命令的個數。如果沒有這個參數,make運行命令時能運行多少就運行多少。如果有一個以上的「-j」參數,那麼僅最後一個「-j」才是有效的。(注意這個參數在MS-DOS中是無用的)

「-k」 「--keep-going」 出錯也不停止運行。如果生成一個目標失敗了,那麼依賴於其上的目標就不會被執行了。

「-l <load>」 「--load-average[=<load]」 「—max-load[=<load>]」 指定make運行命令的負載。

「-n」 「--just-print」 「--dry-run」 「--recon」 僅輸出執行過程中的命令序列,但並不執行。

「-o <file>」 「--old-file=<file>」 「--assume-old=<file>」 不重新生成的指定的<file>,即使這個目標的依賴文件新於它。

「-p」 「--print-data-base」 輸出makefile中的所有數據,包括所有的規則和變數。這個參數會讓一個簡單的makefile都會輸出一堆信息。如果你只是想輸出信息而不想執行makefile,你可以使用「make -qp」命令。如果你想查看執行makefile前的預設變數和規則,你可以使用 「make –p –f /dev/null」。這個參數輸出的信息會包含著你的makefile文件的文件名和行號,所以,用這個參數來調試你的 makefile會是很有用的,特別是當你的環境變數很復雜的時候。

「-q」 「--question」 不運行命令,也不輸出。僅僅是檢查所指定的目標是否需要更新。如果是0則說明要更新,如果是2則說明有錯誤發生。

「-r」 「--no-builtin-rules」 禁止make使用任何隱含規則。

「-R」 「--no-builtin-variabes」 禁止make使用任何作用於變數上的隱含規則。

「-s」 「--silent」 「--quiet」 在命令運行時不輸出命令的輸出。

「-S」 「--no-keep-going」 「--stop」 取消「-k」選項的作用。因為有些時候,make的選項是從環境變數「MAKEFLAGS」中繼承下來的。所以你可以在命令行中使用這個參數來讓環境變數中的「-k」選項失效。

「-t」 「--touch」 相當於UNIX的touch命令,只是把目標的修改日期變成最新的,也就是阻止生成目標的命令運行。

「-v」 「--version」 輸出make程序的版本、版權等關於make的信息。

「-w」 「--print-directory」 輸出運行makefile之前和之後的信息。這個參數對於跟蹤嵌套式調用make時很有用。

「--no-print-directory」 禁止「-w」選項。

「-W <file>」 「--what-if=<file>」 「--new-file=<file>」 「--assume-file=<file>」 假定目標<file>;需要更新,如果和「-n」選項使用,那麼這個參數會輸出該目標更新時的運行動作。如果沒有「-n」那麼就像運行UNIX的「touch」命令一樣,使得<file>;的修改時間為當前時間。

「--warn-undefined-variables」 只要make發現有未定義的變數,那麼就輸出警告信息。

⑶ makefile到底是干什麼用的

一個工程(project)中的源文件不計其數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因為 makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。

Makefile 文件描述了整個工程的編譯、連接等規則。其中包括:工程中的哪些源文件需要編譯以及如何編譯、需要創建那些庫文件以及如何創建這些庫文件、如何最後產生我們想要的可執行文件。盡管看起來可能是很復雜的事情,但是為工程編寫Makefile 的好處是能夠使用一行命令來完成「自動化編譯」,一旦提供一個(通常對於一個工程來說會是多個)正確的
Makefile。編譯整個工程你所要做的唯一的一件事就是在shell 提示符下輸入make命令。整個工程完全自動編譯,極大提高了效率。

如果你使用的是帶有圖形用戶界面的集成化開發環境如VisualStudio,一般用不著手動編寫makefile文件,當你需要時,VS可以為你自動生成。

⑷ Cmake是什麼有什麼用在WINDOWS下如何用

CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。
通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建項目生成目標文件,還支持安裝(make install)、測試安裝的程序是否能正確執行(make test,或者ctest)、生成當前平台的安裝包(make package)、生成源碼包(make package_source)、產生Dashboard顯示數據並上傳等高級功能,只要在CMakeLists.txt中簡單配置,就可以完成很多復雜的功能,包括寫測試用例。
如果有嵌套目錄,子目錄下可以有自己的CMakeLists.txt。
總之,CMake是一個非常強大的編譯自動配置工具,支持各種平台,KDE也是用它編譯的,感興趣的可以試用一下。

准備活動:
(1)安裝cmake。
下載地址:http://www.cmake.org/cmake/resources/software.html
根據自己的需要下載相應的包即可,Windows下可以下載zip壓縮的綠色版本,還可以下載源代碼。
Windows下CMake的使用
(2)運行cmake的方法。(GUI、命令行)
http://www.cmake.org/cmake/help/runningcmake.html

CMake使用步驟:
運行GUI的cmake界面:
cmake-2.8.1-win32-x86\bin\cmake-gui.exe
Windows下CMake的使用
執行Configure:
運行之後,生成了如下文件:
Windows下CMake的使用
生成Makefile:
執行Generate之後生成如下文件:
Windows下CMake的使用
運行make進行編譯:
Windows下CMake的使用
編譯完成後,在build目錄生成Tutorial.exe,運行Tutorial.exe 25就可以看到運行結果:
Windows下CMake的使用
運行make install安裝程序:
Windows下CMake的使用
運行make test進行測試:
Windows下CMake的使用

通過cmake tutorial學習CMake配置方法
http://www.cmake.org/cmake/help/cmake_tutorial.html
可以在源代碼的Tests/Turorial目錄中找到這個手冊對應的代碼。
Windows下CMake的使用
1、Step1。
(如果不知道如何使用cmake,以及如何使用編譯產生的Turorial.exe,可先看下前面「CMake使用步驟」的說明,它以Step4為例詳細介紹了使用過程,Step1的配置可能不夠完全,比如無法運行make install,無法運行make test,但可以參考。)
簡單的程序編譯。
(1)運行GUI的cmake,指定要編譯的源代碼路徑和二進制文件路徑(會自動創建)。
Windows下CMake的使用
(2)點擊Configure,配置成功後,再點擊Generate。
配置需要選擇合適的編譯器,雖然我安裝了VC2008,但沒有配置成功;選擇Unix Makefiles,配置成功,它自動找到了DevC++下的gcc.exe等編譯器。
Windows下CMake的使用
(3)在build3目錄執行make,就能夠編譯生成Turorial.exe了。
D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>make
Linking CXX executable Tutorial.exe
[100%] Built target Tutorial
可以運行一下Turorial.exe:
D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>Tutorial.exe
Tutorial.exe Version 1.0
Usage: Tutorial.exe number
D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>Tutorial.exe 4
The square root of 4 is 2
2、Step2
把子目錄編譯為庫,並且鏈接到最終的可執行文件。
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions) # 使得子目錄MathFunctions也能被編譯

# add the executable
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial MathFunctions)
產生makefile:
在GUI上點擊Configure,之後Generate還是灰色,再次點擊Configure,Generate就可以點擊了。
編譯:

⑸ linux系統make命令使用方法

Make:意思是編譯過程,同時存在緩存當中,當執行make install 才是真正的安裝

例如:我需要安裝一個libxml2-2.6.30 包
解壓: tar -zxvf libxml2-2.6.30
進入目錄: cd /lamp/libxml2-2.6.30
安裝指定路徑: ./configure --prefix=/usr/local/libxml2/
編譯: make
安裝: make install

⑹ linux中make,check是什麼命令

make命令是運行的所在目錄下的Makefile文件,如果Makefile 里有check的話,會執行測試,也就是檢查下編譯出來的東西能不能用。學習linux命令,請多看看《linux就該這么學》一書。

⑺ Makefile詳解

make 命令執行時,需要根據一些規則來決定按照怎麼樣的方式去 編譯和鏈接程序 ,這些規則就由 makefile 文件所指定。如果我們 makefile 文件寫的足夠好,make 命令會自動地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。

首先,本消謹握文將給出一個makefile文件的示例,以便大家能有一個直觀感受,這個例子來拿慶源於 GNU的make使用手冊 。在這個例子中,我們的工程有8個c文件,和3個頭文件,我們要寫一個makefile來告訴make命令如何編譯和鏈接這幾個文件。例子如下:

這個例子里 make 的編碼規則如下:

a. 如果這個工程沒有編譯過,那麼我們的所有c文件都要編譯並被鏈接。
b. 如果這個工程的某幾個c文件被修改,那麼我們只編譯被修改的c文件,並鏈接目標程序。
c. 如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的c文件,並鏈接目標程序。

在詳細拆解上一節的 Makefile 之前,先來看下 Makefile 的基本範式。

target可以是一個 1) object file(可執行文件) ,2) 可執行文件 ,還可以是個3) label(標簽) ,關於標簽這個特性,在後面的 偽目標 章節還會有敘述。

prerequisites 就是,要生成那個target所需要的文件或是目標。 command 也就是 make 需要執行的命令,可以是任意的
shell 命令。

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

有了這些規晌跡則後,再來分析上面的例子。在這個 makefile 中,目標文件(target)包含:

依賴文件(prerequisites)就是冒號後面的那些 .c 文件和 .h 文件。每一個 .o 文件都有一組依賴文件,而這些 .o 文件又是執行文件 edit 的依賴文件。

在定義好依賴關系後,後續的那一行定義了如何生成目標文件的系統命令, 一定要以一個tab鍵作為開頭 。 make 會比較
targets 文件和 prerequisites 文件的修改日期,如果 prerequisites 文件的日期要比targets文件的日期要新,或者 target 不存在的話,那麼,make就會執行後續定義的命令。

我們可以把這個內容保存在名字為 makefile 或 Makefile 的文件中,然後在該目錄下直接輸入命令 make 就可以生成可執行文件edit。如果要刪除執行文件和所有的中間目標文件,那麼,只要簡單地執行一下 make clean 就可以了。 註:反斜線()是換行符的意思,這樣比較便於閱讀。

這里要說明一點的是, clean 不是一個文件,它只不過是一個動作名字,有點像C語言中的 lable 一樣,其冒號後什麼也沒有,那麼,make就不會去找它的依賴性,也就不會自動執行其後所定義的命令。要執行其後的命令(不僅用於 clean,其他 lable 同樣適用),就要在 make 命令後顯式指出這個 lable 的名字。這樣的方法非常有用, 我們可以在一個 makefile 中定義不用的編譯或是和編譯無關的命令,比如程序的打包,程序的備份 ,等等。

在默認的方式下,也就是我們只輸入make命令。那麼,

這就是整個 make 的依賴性,make 會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。在找尋的過程中,如果出現錯誤,比如最後被依賴的文件找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,這些都不在 make 職責范圍內。

通過上述分析,我們知道,像 clean 這種,沒有被第一個目標文件直接或間接關聯,那麼它後面所定義的命令將不會被自動執行,不過,我們可以顯示要 make 執行。即命令 make clean ,以此來清除所有的目標文件,以便重編譯。

在上面的例子中可以看到,後綴為 .o 的一大串文件名寫了兩次,這樣比較費時費力,而且如果文件有所增減,要修改的地方也非常多,對以後的維護造成困難。在這種情形下,我們可以在Makefile里使用變數代替這一大串依賴文件,這里變數的使用方式基本類似於shell腳本里變數的使用方法。

我們可以在makefile一開始就這樣定義:

那麼接下來我們就可以很方便地在我們的Makefile中以 $(objects) 的方式來使用這個變數了,於是如果有新的 .o 文件加入,我們只需簡單地修改一下 objects 變數就可以了。

GNU 的 make 很強大,它可以自動推導文件以及文件依賴關系後面的命令,於是我們就沒必要去在每一個 .o 文件後都寫上類似的命令。因為,我們的make會自動識別,並自己推導命令。

只要make看到一個 .o 文件,它就會自動的把 .c 文件加在依賴關系中,如果make找到一個 FILENAME.o ,那麼 FILENAME.c ,就會是 FILENAME.o 的依賴文件。並且 cc -c FILENAME.c 也會被推導出來,於是,我們的makefile 再也不用寫得這么復雜。我們的新makefile就可以這么寫了。

這種方法,也就是make的**。上面文件內容中,「.PHONY」表示,clean是個偽目標文件。

⑻ Linux中make, make install命令分別是什麼,用法

make是用來編譯的,它從Makefile中讀取指令,然後編譯。

make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。

用法:

1、make:

這一步就是編譯,大多數的源代碼包都經過這一步進行編譯(當然有些perl或python編寫的軟體需要調用perl或python來進行編譯)。

如果 在 make 過程中出現 error ,就要記下錯誤代碼(注意不僅僅是最後一行),然後可以向開發者提交 bugreport(一般在 INSTALL 里有提交地址)。

或者系統少了一些依賴庫等,這些需要自己仔細研究錯誤代碼。

make 的作用是開始進行源代碼編譯,以及一些功能的提供,這些功能由他的 Makefile 設置文件提供相關的功能。

比如 make install 一般表示進行安裝,make uninstall 是卸載,不加參數就是默認的進行源代碼編譯。

make 是 Linux 開發套件裡面自動化編譯的一個控製程序,他通過藉助 Makefile 裡面編寫的編譯規范進行自動化的調用 gcc 、ld 以及運行某些需要的程序進行編譯的程序。

一般情況下,他所使用的 Makefile 控制代碼,由 configure 這個設置腳本根據給定的參數和系統環境生成。

2、make install

這條命令來進行安裝(當然有些軟體需要先運行 make check 或 make test來進行一些測試),這一步一般需要你有 root 許可權(因為要向系統寫入文件)。

(8)make命令是干什麼用的擴展閱讀

當我們在使用make命令時,常常會在make後面加上其他單詞,比如check,install,installcheck…這些單詞都是make的參數,我們稱之為「目標(targets)」。

最常見的幾個目標:

make all:編譯程序、庫、文檔等(等同於make)

make install:安裝已經編譯好的程序。復制文件樹中到文件到指定的位置

make unistall:卸載已經安裝的程序。

make clean:刪除由make命令產生的文件

make distclean:刪除由./configure產生的文件

make check:測試剛剛編譯的軟體(某些程序可能不支持)

make installcheck:檢查安裝的庫和程序(某些程序可能不支持)

make dist:重新打包成packname-version.tar.gz

閱讀全文

與make命令是干什麼用的相關的資料

熱點內容
重慶農村商業銀行app怎麼老出問題 瀏覽:467
慧編程配置要求 瀏覽:669
數控機床編程與操作視頻 瀏覽:458
文件夾資料誤刪怎麼辦 瀏覽:81
手機app怎麼下載安裝 瀏覽:492
最新的java版本 瀏覽:993
萬卷小說緩存在哪個文件夾 瀏覽:687
st單片機怎樣燒 瀏覽:871
watch怎麼下載APP 瀏覽:821
銀行程序員面試 瀏覽:358
我的世界的伺服器為什麼不能更新 瀏覽:769
命令與征服絕命時刻比賽視頻 瀏覽:827
電腦捕獲視頻的文件夾怎麼換 瀏覽:482
windows編譯安卓軟體 瀏覽:210
加密dns列表 瀏覽:990
股市操練大全八冊pdf 瀏覽:120
c傳遞指針到python 瀏覽:163
手動添加引導的命令 瀏覽:54
740伺服器小藍條是做什麼的 瀏覽:523
linux文件操作命令 瀏覽:130