国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Linux > 正文

Linux自動(dòng)化構(gòu)建工具M(jìn)akefile與make怎樣用

2024-08-27 23:55:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  這篇文章主要介紹“Linux自動(dòng)化構(gòu)建工具M(jìn)akefile與make怎么用”,在日常操作中,相信很多人在Linux自動(dòng)化構(gòu)建工具M(jìn)akefile與make怎么用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Linux自動(dòng)化構(gòu)建工具M(jìn)akefile與make怎么用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
 
  Linux自動(dòng)化構(gòu)建工具M(jìn)akefile與make怎么用
 
  Makefile
  Makefile是一個(gè)文本文件,記錄一個(gè)項(xiàng)目的構(gòu)建規(guī)則流程。在工作中會(huì)不會(huì)寫(xiě)makefile,從一個(gè)側(cè)面說(shuō)明了一個(gè)人是否具備完成大型工程的能力,同時(shí)一個(gè)工程中的源文件不計(jì)數(shù),其按類(lèi)型、功能、模塊分別放在若干個(gè)目錄中,makefile定義了一系列的規(guī)則來(lái)指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)行更復(fù)雜的功能操作,其帶來(lái)的好處就是——“自動(dòng)化編譯”,一旦寫(xiě)好,只需要一個(gè)make命令,整個(gè)工程完全自動(dòng)編
  譯,極大的提高了軟件開(kāi)發(fā)的效率。
 
  make
  make是一個(gè)命令工具,是一個(gè)解釋makefile中指令的命令工具,一般來(lái)說(shuō),大多數(shù)的IDE都有這個(gè)命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見(jiàn),makefile都成為了一
  種在工程方面的編譯方法。make是一條命令,makefile是一個(gè)文件,兩個(gè)搭配使用,完成項(xiàng)目自動(dòng)化構(gòu)建。
 
  工作原理
  在Makefile中會(huì)形成各個(gè)文件之間的依賴(lài)關(guān)系,比如一個(gè)code.exe是在code.o 的基礎(chǔ)上通過(guò)鏈接生成的,而code.o是在code.s的基礎(chǔ)上通過(guò)匯編形成的,code.s是在code.i的基礎(chǔ)上通過(guò)編譯生成,code.i是在code.c的基礎(chǔ)上預(yù)處理完成之后生成,如此層層尋找源頭。其規(guī)則使用倒敘的方法,將第一個(gè)文件視作最后完后的文件,若當(dāng)前文件未生成則通過(guò)依賴(lài)關(guān)系以及相互生成的方法進(jìn)行層層推進(jìn),最終完成全部文件的形成。
  依賴(lài)關(guān)系
 
  A:B   A是依賴(lài)于B
 
  依賴(lài)方法
 
  gcc 選項(xiàng) + B -o +A   A是B經(jīng)過(guò)處理生成的文件
 
  項(xiàng)目清理
 
  工程是需要被清理的,像clean這種,沒(méi)有被第一個(gè)目標(biāo)文件直接或間接關(guān)聯(lián),那么它后面所定義的命令將不會(huì)被自動(dòng)執(zhí)行,不過(guò),我們可以顯示要make執(zhí)行。即命令——“make clean”,以此來(lái)清除所有的目標(biāo)文件,以便重編譯。但是一般我們這種clean的目標(biāo)文件,我們將它設(shè)置為偽目標(biāo),用 .PHONY 修飾,偽目標(biāo)的特性是,總是被
  執(zhí)行的。
 
  原理
 
  make會(huì)在當(dāng)前目錄下找名字叫“Makefile”或“makefile”的文件。
 
  如果找到,它會(huì)找文件中內(nèi)容中的第一個(gè)文件,并把這個(gè)文件作為最終的目標(biāo)文件。
 
  如果該文件當(dāng)前不存在,或是該文件的依賴(lài)文件的修改時(shí)間要比當(dāng)前這個(gè)文件要新,那么,他就會(huì)執(zhí)行后面所定義的命令來(lái)生成當(dāng)前文件。
 
  如果該文件的依賴(lài)文件不存在,那么便對(duì)這個(gè)依賴(lài)文件進(jìn)行如同第2,3步的步驟,知道找到最后的源文件為止
 
  當(dāng)然,你的C文件和H文件是存在的啦,于是make會(huì)生成 .o 文件,然后再用 .o 文件聲明make的終極任務(wù),也就是執(zhí)行文件了。
 
  這就是整個(gè)make的依賴(lài)性,make會(huì)一層又一層地去找文件的依賴(lài)關(guān)系,直到最終編譯出第一個(gè)目標(biāo)文件。
 
  在找尋的過(guò)程中,如果出現(xiàn)錯(cuò)誤,比如最后被依賴(lài)的文件找不到,那么make就會(huì)直接退出,并報(bào)錯(cuò),而對(duì)于所定義的命令的錯(cuò)誤,或是編譯不成功,make根本不理。
 
  make只管文件的依賴(lài)性,即,如果在我找了依賴(lài)關(guān)系之后,冒號(hào)后面的文件還是不在,那么對(duì)不起,我就不工作啦。
 
  make 每次在Makefile中只會(huì)找到第一個(gè)目標(biāo)對(duì)象進(jìn)行生成,生成之后就會(huì)退出(不會(huì)生成第二個(gè)對(duì)象)
 
  .PHONY: clean
 
  clear:
 
    rm -rf $(obj)
 
  【補(bǔ)充】
 
  1.預(yù)定義變量的使用:[$@ ]、[ $^]、[ $<],可以用以上三個(gè)對(duì)文件名進(jìn)行替換
 
  $@ :表示目標(biāo)對(duì)象
 
  $^:表示所有依賴(lài)對(duì)象
 
  &<:表示依賴(lài)對(duì)象的第一個(gè)
 
  2. $ (wildcard ./.c)獲取當(dāng)前目錄下所有的以.c結(jié)尾的文件的文件名稱(chēng)【例】 src=$(wildcard ./.c)   code: $ (str)
 
  3. $ (patsubst %.c, %.o,$(str))表示將str變量中的.c文件替換成.o,然后存放在obj變量中。
 
  4. 偽對(duì)象:聲明一個(gè)目標(biāo)對(duì)象與外部文件無(wú)關(guān),表示每次對(duì)這個(gè)對(duì)象不管是否最新都要重新生成,且不管外部是否能夠存在,都要每次無(wú)論如何都執(zhí)行語(yǔ)句[.PHONY:]
 
  5.程序的編譯過(guò)程:一般包含預(yù)處理、編譯、匯編、鏈接,但是在實(shí)際項(xiàng)目構(gòu)建中整體分為兩步,即編譯和鏈接。這樣的好處在于,如果只是修改了一個(gè).c文件,對(duì)于之前的直接對(duì)所有.c進(jìn)行編譯生成可執(zhí)行程序的過(guò)程來(lái)說(shuō),需要重新編譯所有的.c生成可執(zhí)行程序,這樣的效率非常低下,因此分為兩步進(jìn)行操作,先把每個(gè).c都是生成自己的.o,然后再將所有的.o鏈接在一起,一旦一個(gè).c發(fā)生改變只需要對(duì)這一個(gè).c進(jìn)行生成.o之后,替換程序中的指定模塊就可以。

(編輯:武林網(wǎng))

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 三明市| 金昌市| 宁夏| 邹城市| 南安市| 东方市| 珲春市| 正镶白旗| 正宁县| 元氏县| 延庆县| 杂多县| 黄冈市| 顺昌县| 邵阳市| 新田县| 开平市| 武胜县| 黔江区| 娄底市| 洪洞县| 景泰县| 泸州市| 中方县| 班玛县| 赤城县| 图片| 西藏| 明水县| 靖江市| 大渡口区| 红河县| 张掖市| 富平县| 双柏县| 康乐县| 逊克县| 平凉市| 来安县| 武宣县| 库车县|