當前位置 主頁 > 服務器問題 > Linux/apache問題 > 最大化 縮小

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

    欄目:Linux/apache問題 時間:2019-12-28 14:07

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

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

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

    say_hello:
    echo "Hello World"

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

    $ make
    echo "Hello World"
    Hello World

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

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

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

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

    final_target: sub_target final_target.c
    Recipe_to_create_final_target
    sub_target: sub_target.c
    Recipe_to_create_sub_target

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

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

    say_hello:
    @echo "Hello World"
    
    

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

    $ make
    Hello World

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

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

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

    在 Makefile 文件開頭增加 .DEFAULT_GOAL:

    .DEFAULT_GOAL := generate

    make 會將 generate 作為默認目標:

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

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

    all: say_hello generate
    say_hello:
    @echo "Hello World"
    generate:
    @echo "Creating empty text files..."
    touch file-{1..10}.txt
    clean:
    @echo "Cleaning up..."
    rm *.txt
    
    
    
    下一篇:沒有了
777亚洲人成视频免费视频