2016-11-12 68 views
1

我寫了這個簡單的makefile,它工作正常,直到我想做一些更改並將它們應用到二進制文件中。然後,我需要再次做'乾淨'和'做',因爲obj。文件不會被重建。儘管到目前爲止,它似乎是一個簡單的任務,但我沒有修改它以便製作obj。文件隱式重建(因此,當我修改源代碼時,我只能寫'make')。爲什麼這個簡單的makefile不會在重建時重建源代碼?

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修改建議(我想同自己之前,我寫了這個問題),這是結果:

[email protected]: ~/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; 
}[email protected]: ~/mypath$ make 
g++-5.3 a.o -o a 
[email protected]: ~/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 
+0

'。所以改變'a.o:'這一行來讀取'a.o:a.cpp'。還要改變目標'build',這取決於'a',而不是'a.o',並添加一個目標'a:a.o'來完成鏈接。 – Peter

回答

4

只要改變這個

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

到此

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

既然你從來沒有告訴生成文件a.o取決於a.cpp,它將不能確定當a.cpp改變時,它應該重建a.o

讓我知道如果它不起作用,我對我的makefiles有點生疏。

+0

沒有。我在a.cpp中犯了一個語法錯誤,當我寫'make'時發生這種情況:'g ++ - 5.3 a.o -o a'。這會比應該花費更多的時間: - /。我正在使用爲x86_64-redhat-linux-gnu構建的GNU make 3.81。 – Smarty77

1

如果你告訴做什麼,它會做你說的。如果您編寫的規則的編制規則爲a.o且沒有列出先決條件,則認爲目標沒有先決條件:如果目標(a.o)存在,則make將認爲它是最新的。 Omada告訴你如何通過添加先決條件來避免這種情況。您也可以不用定義自己的規則,而只需使用make的內置規則,該規則已知道如何從.cpp文件創建目標文件(但它使用CXX變量而不是COMPILER)。

同樣,如果您定義的規則build: a.o,告訴令,爲了建立一個名爲build目標,應該看到,如果一個名爲build文件是否存在,如果a.o比它更新。如果文件build不存在,那麼它將運行您提供的配方。

由於您的配方,$(COMPILER) $(CXXFLAGS) a.o -o a實際上並沒有創建一個名爲build的文件,它總是過期並且將始終運行。

你必須確保你的食譜實際上是創建你試圖構建目標的名稱:a.o`需要靠`a.cpp`

a: a.o 
     $(COMPILER) a.o -o a 
相關問題