簡體   English   中英

Makefile,更好地理解規則

[英]Makefile, better understanding rules

閱讀官方文檔

前提條件是文件將用作創建目標的輸入。 目標通常取決於多個文件。

如果我的源文件已經包含標題,是否應該在規則中列出標題?

src.c

#include <stdio.h>
#include "myheader.h"

int main()
{
    printMessage();
    return 0;
}

myheader.h

void printMessage()
{
    printf("a message to screen\n");
}

生成文件

src : src.o
    cc -o src src.o

src.o : src.c
    cc -c src.c

如果在先決條件中添加myheader.h ,它什么也不會改變,則相同的消息會顯示在屏幕上。 如果顯式包含標頭,則它是否應該出現在先決條件中?

頭文件應包含在依賴項列表中。

首次使用make生成程序時,無論是否將myheader.h作為依賴項進行編譯,它的編譯方式都相同。 區別在於其中一個文件更改時會發生什么。

如果您再次運行make而不make任何更改,則會顯示“ src”是最新的,不會編譯任何內容。 但是,如果要修改myheader.h 且未將其作為依賴項包含在內,那么make會說目標是最新的。 它不會查看源文件來查看包含的文件。 make實用程序對C或C ++源代碼(或任何其他源代碼)一無所知。 查看給定文件是否已更改,而不查看其內容。

當將myheader.h作為依賴項包含時,如果以后修改該文件,則運行make將重新生成程序。

如果要了解給定源文件所依賴的所有非系統頭文件,則可以-MM選項運行gcc。 這將輸出一條生成規則,列出源文件的頭文件依賴項。

例如,如果運行gcc -MM src.c ,將得到以下輸出:

src.o: src.c myheader.h

然后,您可以將其包含在makefile中。

是的你應該。

make程序使用文件列表來確定依賴項是否已更改,因此應重建目標。 它需要您明確指定該依賴關系。

它看不到包含,只看到您指定的規則。 因此,從理論上講,您可能會以重新編譯src.o的方式更改標頭,但除非告知您注意,否則make不會知道您是否這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM