makefile學習要點彙總

2022-04-03 00:23:42 字數 2027 閱讀 5271

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

1、make 會在當前目錄下找名字叫「makefile」或「makefile」的檔案。

2、如果找到,它會找檔案中的第乙個目標檔案(target),在上面的例子中,他會找到「edit」這個檔案,並把這個檔案作為最終的目標檔案。

3、如果 edit 檔案不存在,或是 edit 所依賴的後面的[.o]檔案的檔案修改時間要比edit 這個檔案新,那麼,他就會執行後面所定義的命令來生成 edit 這個檔案。

4、如果 edit 所依賴的.o 檔案也存在,那麼 make 會在當前檔案中找目標為.o 檔案的依賴性,如果找到則再根據那乙個規則生成.o 檔案。(這有點像乙個堆疊的過程)

5、當然,你的 c 檔案和 h 檔案是存在的啦,於是 make 會生成 .o 檔案,然後再用 .o檔案生命 make 的終極任務,也就是執行檔案 edit 了。

make工作步驟

1、讀入所有的 makefile。

2、讀入被 include 的其它 makefile。

3、初始化檔案中的變數。

4、推導隱晦規則,並分析所有規則。

5、為所有的目標檔案建立依賴關係鏈。

6、根據依賴關係,決定哪些目標要重新生成。

7、執行生成命令。

在定義好依賴關係後,後續的那一行定義了如何生成目標檔案的作業系統命令,一定要以乙個 tab 鍵作為開頭。記住,make 並不管命令是怎麼工作的,他只管執行所定義的命令。make

會比較 targets 檔案和 prerequisites 檔案的修改日期(時間戳),如果 prerequisites 檔案的日期要比 targets 檔案的日期要新,或者 target 不存在的話,那麼,make 就會執行後續定義的命令。值得一提的是makefile中定義的變數在執行之初並不會具體展開,但是採用了一種拖延戰術,如果變數出現在依賴關係的規則中,那麼僅當這條依賴被決定要使用了,變數才會在其內部展開。

makefile 裡主要包含了五個東西:顯示規則、隱晦規則、變數定義、檔案指示和注釋。

1、顯示規則。顯示規則說明了,如何生成乙個或多的的目標檔案。這是由 makefile 的書寫者明顯指出,要生成的檔案,檔案的依賴檔案,生成的命令。

2、隱晦規則。由於我們的 make 有自動推導的功能,所以隱晦的規則可以讓我們比較粗糙地簡略地書寫 makefile,這是由 make 所支援的。

3、變數的定義。在 makefile 中我們要定義一系列的變數,變數一般都是字串,這個有點像 c 語言中的巨集,當 makefile 被執行時,其中的變數都會被擴充套件到相應的引用位置上。

4、檔案指示。其包括了三個部分,乙個是在乙個 makefile 中引用另乙個 makefile,就像 c 語言中的 include 一樣;另乙個是指根據某些情況指定 makefile 中的有效部分,就

像 c 語言中的預編譯#if 一樣;還有就是定義乙個多行的命令。。

5、注釋。makefile 中只有行注釋,和 unix 的 shell 指令碼一樣,其注釋是用「#」字元,這個就像 c/c++中的「//」一樣。如果你要在你的 makefile 中使用「#」字元,可以用反斜框進行轉義, 如:「\#」。

6、最後,還值得一提的是,在 makefile 中的命令,必須要以[tab]鍵開始

相信這會兒對makefile有了大概的了解。在文中提到多次尋找依賴項,這個尋找過程是怎麼樣的,它是通過makefile的環境變數vpath,makefile會展昭這個變數中所制定的目錄去尋找具體的依賴項以及目標檔案,當然當前目錄在這個時候仍然具有最高優先順序。另一種檔案搜尋方式是vpath,它有三種方式,具體如下

1、vpath 為符合模式的檔案指定搜尋目錄。

2、vpath 清除符合模式的檔案的搜尋目錄。

3、vpath  清除所有已被設定好了的檔案搜尋目錄。

Makefile知識要點

clean rm o phony clean phony顯式地告訴 make clean的是偽目標,那麼每次makeclean必然會執行rm o。否則存在一種可能性,假如當前路徑下有乙個名為clean的檔案,因為clean這個目標又沒有依賴的檔案,那這個clean檔案永遠被認為是最新的,導致rm指令...

CString要點彙總

1 對乙個 cstring 變數,你可以使用的唯一合法轉換符是 lpctstr,直接 轉換成非常量指標 lptstr const char 是錯誤的。2.getbuffer getbuffer 用來得到乙個指向緩衝區的非常量指標.getbuffer 主要作用是將字串的緩衝區長度鎖定,releaseb...

Makefile編譯問題彙總

最近使用makefile編譯遇到了些問題,反覆地排查了4天多,才解決,要處理的問題很簡單,就是把一堆.c檔案編譯打包成.so,然後再把.so和demo.o打包成可執行檔案,遇到了下面 三個問題,總結一下 1 問題描述在這裡 原因 在生成可執行檔案的時候,加入了 shared引數,這時生成的並不是可執...