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

首頁 > 系統 > Linux > 正文

Linux里Makefile是什么?它是如何工作的?

2024-08-28 00:04:30
字體:
來源:轉載
供稿:網友

用這個方便的工具來更有效的運行和編譯你的程序
makefile是用于自動編譯和鏈接的,一個工程有很多文件組成,每一個文件的改變都會導致工程的重新鏈接-----但是不是所有的文件都需要重新編譯,makefile能夠紀錄文件的信息,決定在鏈接的時候需要重新編譯哪些文件!

當你需要在一些源文件改變后運行或更新一個任務時,通常會用到 make 工具。make 工具需要讀取一個 Makefile(或 makefile)文件,在該文件中定義了一系列需要執行的任務。你可以使用 make 來將源代碼編譯為可執行程序。大部分開源項目會使用 make 來實現最終的二進制文件的編譯,然后使用 make install 命令來執行安裝。
本文將通過一些基礎和進階的示例來展示 make 和 Makefile 的使用方法。在開始前,請確保你的系統中安裝了 make。

基礎示例
依然從打印 “Hello World” 開始。首先創建一個名字為 myproject 的目錄,目錄下新建 Makefile 文件,文件內容為:

say_hello:echo "Hello World"

在 myproject 目錄下執行 make,會有如下輸出:

$ makeecho "Hello World"Hello World

在上面的例子中,“say_hello” 類似于其他編程語言中的函數名。這被稱之為 目標(target)。在該目標之后的是預置條件或依賴。為了簡單起見,我們在這個示例中沒有定義預置條件。echo ‘Hello World' 命令被稱為 步驟(recipe)。這些步驟基于預置條件來實現目標。目標、預置條件和步驟共同構成一個規則。

總結一下,一個典型的規則的語法為:

目標: 預置條件
<TAB> 步驟

作為示例,目標可以是一個基于預置條件(源代碼)的二進制文件。另一方面,預置條件也可以是依賴其他預置條件的目標。

final_target: sub_target final_target.cRecipe_to_create_final_targetsub_target: sub_target.cRecipe_to_create_sub_target

目標并不要求是一個文件,也可以只是步驟的名字,就如我們的例子中一樣。我們稱之為“偽目標”

再回到上面的示例中,當 make 被執行時,整條指令 echo "Hello World" 都被顯示出來,之后才是真正的執行結果。如果不希望指令本身被打印處理,需要在 echo 前添加 @

say_hello:@echo "Hello World"

重新運行 make,將會只有如下輸出:

$ makeHello World

接下來在 Makefile 中添加如下偽目標:generate 和 clean:

say_hello:@echo "Hello World"generate:@echo "Creating empty text files..."touch file-{1..10}.txtclean:@echo "Cleaning up..."rm *.txt

隨后當我們運行 make 時,只有 say_hello 這個目標被執行。這是因為Makefile 中的第一個目標為默認目標。通常情況下會調用默認目標,這就是你在大多數項目中看到 all 作為第一個目標而出現。all 負責來調用它他的目標。我們可以通過 .DEFAULT_GOAL 這個特殊的偽目標來覆蓋掉默認的行為。

在 Makefile 文件開頭增加 .DEFAULT_GOAL:

.DEFAULT_GOAL := generate

make 會將 generate 作為默認目標:

$ makeCreating empty text files...touch file-{1..10}.txt

顧名思義,.DEFAULT_GOAL 偽目標僅能定義一個目標。這就是為什么很多 Makefile 會包括 all 這個目標,這樣可以調用多個目標。
下面刪除掉 .DEFAULT_GOAL,增加 all 目標:

all: say_hello generatesay_hello:@echo "Hello World"generate:@echo "Creating empty text files..."touch file-{1..10}.txtclean:@echo "Cleaning up..."rm *.txt
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 囊谦县| 漳浦县| 宁都县| 西贡区| 平乡县| 班玛县| 安多县| 广昌县| 安阳市| 濮阳县| 都昌县| 吉林省| 依安县| 南康市| 北票市| 鄂尔多斯市| 三原县| 治县。| 洪泽县| 治多县| 石狮市| 临城县| 湘潭市| 金秀| 凤凰县| 昌宁县| 剑川县| 革吉县| 额尔古纳市| 谢通门县| 巴里| 盈江县| 鲁甸县| 华坪县| 昌图县| 颍上县| 溆浦县| 治多县| 金沙县| 延长县| 麻城市|