gnu_make_中文手冊v3.8_學習_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、GNUMake中文手冊中文手冊v3.8學習學習?這個手冊翻譯整理翻譯整理:徐海兵徐海兵先表示一些尊敬.“本人在工作之余,花了18個多月時間完成對“infomake”的翻譯整理,完成這個中文版手冊”工夫不負有心人.?鏈接器將.o文件中使用的函數和其它.o或者庫文件中的相關符號進行合并,對所有文件中的符號進行重新安排(重定位),并鏈接系統(tǒng)相關文件(程序啟動文件等)最終生成可執(zhí)行程序。?Linux中,共享庫文件格式通常為“ELF”格式。共享庫

2、已經具備了可執(zhí)行條件。?模塊中各個成員的地址(變量引用和函數調用)都是相對地址。使用此共享庫的程序在運行時,共享庫被動態(tài)加載到內存并和主程序在內存中進行連接。多個可執(zhí)行程序可共享庫文件的代碼段(多個程序可以共享的使用庫中的某一個模塊,共享代碼,不共享數據)。另外共享庫的另外共享庫的成員對象可被執(zhí)行(由成員對象可被執(zhí)行(由libdl.so提供支持)提供支持)。?在make讀取Makefile以后會建立一個編譯過程的描述數據庫。此數據庫中記

3、錄了所有各個文件之間的相互關系,以及它們的關系描述(要是我能要是我能“看“到這個數據庫,就能使用程序到這個數據庫,就能使用程序trace,你知道一個大型的,你知道一個大型的project的makefile有多復雜有多復雜)?當使用make工具進行編譯時,工程中以下幾種文件在執(zhí)行make時將會被編譯(重新編譯):1.所有的源文件沒有被編譯過,則對各個C源文件進行編譯并進行鏈接,生成最后的可執(zhí)行程序;2.每一個在上次執(zhí)行make之后修改過的

4、C源代碼文件在本次執(zhí)行make時將會被重新編譯;3.頭文件在上一次執(zhí)行頭文件在上一次執(zhí)行make之后被修改。則所有包含此頭文件的之后被修改。則所有包含此頭文件的C源文件在本次執(zhí)行源文件在本次執(zhí)行make時將會被重新編譯。時將會被重新編譯。(這就是為什么頭文件修改后,很多文件都會被重新這就是為什么頭文件修改后,很多文件都會被重新compile的原的原因)?首先書寫時,可以將一個較長行使用反斜線()來分解為多行,這樣可以使我們的Makefi

5、le書寫清晰、容易閱讀理解。但需要注意:反斜線之后不能有空格(這也是大家最容易犯但需要注意:反斜線之后不能有空格(這也是大家最容易犯的錯誤,錯誤比較隱蔽)的錯誤,錯誤比較隱蔽)?編譯.c源文件規(guī)則的命令可以不用明確給出。這是因為make本身存在一個默認的規(guī)則,能夠自動完成對.c文件的編譯并生成對應的.o文件。它執(zhí)行命令“ccc”來編譯.c源文件。?對一個目標文件是“N.o”,倚賴文件是“N.c”的規(guī)則,完全可以省略其規(guī)則的命令行,而由m

6、ake自身決定使用默認命令。此默認規(guī)則稱為make的隱含規(guī)則。?書寫規(guī)則建議的方式是:單目標,多依賴。就是說盡量要做到一個規(guī)則中只存在一個目標書寫規(guī)則建議的方式是:單目標,多依賴。就是說盡量要做到一個規(guī)則中只存在一個目標文件,可有多個依賴文件。盡量避免多目標,單依賴的方式。文件,可有多個依賴文件。盡量避免多目標,單依賴的方式。這樣后期維護也會非常方便,而且Makefile會更清晰、明了。?在這個Makefile中,根據依賴而不是目標對規(guī)

7、則進行分組根據依賴而不是目標對規(guī)則進行分組(Wrong!)。上例的Makefile就可以這樣來實現:#sampleMakefileobjects=main.okbd.ocomm.odisplay.o.osearch.ofiles.outils.o在規(guī)則中,通配符會被自動展開。但在變量的定義和函數引用時,通配符將失效。這種情況下如果需要通配符有效,就需要使用函數“wildcard”,它的用法是:$(wildcardPATTERN...)。

8、?在Makefile中,它被展開為已經存在的、使用空格分開的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函數會忽略模式字符并返回空。?一般我們可以使用“$(wildcard.c)”來獲取工作目錄下的所有的.c文件列表。復雜一些用法;可以使用“$(patsubst%.c%.o$(wildcard.c))”,首先使用“wildcard”函數獲取工作目錄下的.c文件列表;之后將列表中所有文件名的后綴.c替換為.o。這樣我們就可

9、以得到在當前目錄可生成的.o文件列表。因此在一個目錄下可以使用如下內容的Makefile來將工作目錄下的所有的.c文件進行編譯并最后連接成為一個可執(zhí)行文件:#sampleMakefileobjects:=$(patsubst%.c%.o$(wildcard.c))foo:$(objects)ccofoo$(objects)?“自動化變量”,諸如“$^”等。規(guī)則命令行中的自動化變量“$^”代表所有通過目錄搜索得到的依賴文件的完整路徑名(目

10、錄一般文件名)列表?!?@”代表規(guī)則的目標。所以對于一個規(guī)則我們可以進行如下的描述:foo.o:foo.cccc$(CFLAGS)$^o$@?使用偽目標有兩點原因:1.避免在我們的Makefile中定義的只執(zhí)行命令的目標(此目標的目的為了執(zhí)行執(zhí)行一些列命令,而不需要創(chuàng)建這個目標)和工作目錄下的實際文件出現名字沖突。2.提高執(zhí)行make時的效率,特別是對于一個大型的工程來說,編譯的效率也許你同樣關心。如:在make的并行和遞歸執(zhí)行過程中。

11、此情況下一般會存在一個變量,定義為所有需要make的子目錄。對多個目錄進行make的實現方式可以是:在一個規(guī)則的命令行中使用shell循環(huán)來完成。如下:SUBDIRS=foobarbazsubdirs:fdirin$(SUBDIRS)do$(MAKE)C$$dirdone但這種實現方法存在以下幾個問題:1.當子目錄執(zhí)行make出現錯誤時,make不會退出。就是說,在對某一個目錄執(zhí)行make失敗以后,會繼續(xù)對其他的目錄進行make。在最終

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論