簡體   English   中英

為什么這個簡單的makefile不能在更改時重建源代碼?

[英]Why this simple makefile does not rebuild the source on changes?

我寫了這個簡單的makefile,在我想做一些更改並將它們應用到二進制文件之前,它可以正常工作。 然后,由於obj,我需要再次執行“ make clean”和“ make”。 文件將不會重建。 盡管到目前為止,這似乎是一個簡單的任務,但我未能對其進行修改以使其成為obj。 文件隱式重建(因此,在修改源代碼時,我只能寫“ make”)。

COMPILER=g++-5.3
CXXFLAGS=-std=c++11 -O2 -pedantic

build : a.o
     $(COMPILER) a.o -o a

a.o:
     $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o

clean :
    rm -f *.o *~ a

編輯:我嘗試了由Omada建議的更改(在寫此問題之前,我自己嘗試了相同的方法),結果是:

me@pc: ~/mypath$ cat a.cpp
#include <iostream>
int main(int argc, char* argv[])
{
    if ( argc!=2 ){
        std::ceaaarr<<"Prrogram expects 1 argument\n";
        return 1;
    }
    return 0;
}me@pc: ~/mypath$ make
g++-5.3 a.o -o a
me@pc: ~/mypath$ cat Makefile
#init

COMPILER=g++-5.3
CXXFLAGS=-std=c++11 -O2 -pedantic

build: a.o
        $(COMPILER) a.o -o a

a.o: a.cpp
        $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o

clean:
        rm -f *.o *~ a

只是改變這個

a.o:
    $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o

對此

a.o: a.cpp
    $(COMPILER) $(CXXFLAGS) -c a.cpp -o a.o

由於您從未告訴過makefile ao依賴於a.cpp ,因此無法確定a.cpp更改時應重新a.cpp ao

讓我知道它是否不起作用,我的makefile文件有點生疏。

如果您說出要做什么,它將按照您說的去做。 如果您編寫的規則包含構建ao的目標並且沒有列出先決條件,那么make認為目標沒有先決條件:在這種情況下,如果目標( ao )存在,那么make將假定它是最新的。 Omada告訴您如何通過添加先決條件來避免這種情況。 您也可以不用定義自己的規則,而只是使用make的內置規則,這些規則已經知道如何從.cpp文件創建目標文件(但是,它使用CXX變量而不是COMPILER )。

同樣,如果定義規則build: ao ,則告訴make為了構建名為build的目標,它應該查看是否存在一個名為build的文件,以及ao是否比它新。 如果文件build不存在,它將運行您提供的配方。

由於您的配方$(COMPILER) $(CXXFLAGS) ao -oa實際上並未創建名為build的文件,因此它始終已過期並且將始終運行。

您必須確保您的食譜確實創建了您要構建的目標的名稱:

a: a.o
        $(COMPILER) a.o -o a

暫無
暫無

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

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