在 Makefile 中定義規則



現在我們將學習 Makefile 的規則。

Makefile 目標規則的一般語法如下:

target [target...] : [dependent ....]
[ command ...]

在上面的程式碼中,括號中的引數是可選的,省略號表示一個或多個。這裡需要注意的是,每個命令前面都需要使用製表符。

下面給出一個簡單的示例,其中定義了一個規則,用於從其他三個檔案建立目標 hello。

hello: main.o factorial.o hello.o
   $(CC) main.o factorial.o hello.o -o hello

注意 - 在此示例中,您需要提供規則,以便從原始檔建立所有目標檔案。

語義非常簡單。當您說“make target”時,make 會找到適用的目標規則;並且,如果任何依賴項比目標更新,make 就會依次執行這些命令(在宏替換之後)。如果需要建立任何依賴項,則會首先建立它們(因此您有一個遞迴)。

如果任何命令返回失敗狀態,Make 將終止。在這種情況下,將顯示以下規則:

clean:
   -rm *.o *~ core paper

Make 忽略以連字元開頭的命令列上的返回狀態。例如,誰在乎是否有核心檔案?

Make 會在宏替換後回顯命令,以向您顯示正在發生的事情。有時您可能希望關閉它。例如:

install:
   @echo You must be root to install

人們已經習慣了 Makefile 中的某些目標。您應該始終先瀏覽一下。但是,可以合理地預期會找到 all(或僅 make)、install 和 clean 目標。

  • make all - 它編譯所有內容,以便您可以在安裝應用程式之前進行本地測試。

  • make install - 它將應用程式安裝到正確的位置。

  • make clean - 它清理應用程式,刪除可執行檔案、任何臨時檔案、目標檔案等。

Makefile 隱式規則

該命令應該在所有情況下都能工作,在這些情況下,我們從原始碼 x.cpp 構建可執行檔案 x。這可以表示為一個隱式規則:

.cpp:
   $(CC) $(CFLAGS) $@.cpp $(LDFLAGS) -o $@

此隱式規則說明了如何從 x.c 建立 x -- 對 x.c 執行 cc 並將輸出稱為 x。該規則是隱式的,因為沒有提到特定的目標。它可以在所有情況下使用。

另一個常見的隱式規則是用於從 .cpp(原始檔)構建 .o(目標)檔案。

.cpp.o:
   $(CC) $(CFLAGS) -c $<

alternatively

.cpp.o:
   $(CC) $(CFLAGS) -c $*.cpp
廣告