2015-01-26 71 views
1

我寫了下面的Makefile:並不意味着必須更新可執行

CC=g++ 

all: happy 

happy: happy.o HappyLetter.o 
     $(CC) -o happy happy.o HappyLetter.o 

happy.o: happy.cpp 
     $(CC) -c happy.cpp 

HappyLetter.o: HappyLetter.cpp 
     $(CC) -c HappyLetter.cpp 

clean: 
     rm -rf *.o happy 

,並正與文件HappyLetter.cpp和happy.cpp(包括原)合作,創建一個名爲幸福的可執行文件。

我可以使用make成功構建代碼。但是,當我修改HappyLetter.cpp並再次鍵入「make」時,更改不會反映出來。只有當我輸入'make clean'然後'make'時它才起作用。我希望發生的目標文件的更新回顯到命令行:

$ make 
g++ -c HappyLetter.cpp 
g++ -o happy happy.o HappyLetter.o 

但是,更新到HappyLetter.cpp沒有反映在快樂。

該問題不適用於其他方向。也就是說,如果我修改了happy.cpp,那麼在我鍵入'make'後立即反映更改。

我已經在我的Mac OS X上以及在Ubuntu機器上用三個make二進制文件複製了這個問題。所以我必須在編碼方面做錯了什麼。這裏是文件,這些文件在同一目錄下生成文件的文本:

happy.cpp

#include "HappyLetter.cpp" 

int main() 
{ 
    printf("Hello from happy.cpp!\n"); 
    HappyLetter *myObj = new HappyLetter(); 
    myObj->speak(); 
    return 0; 
} 

HappyLetter.cpp

#include <cstdio> 

class HappyLetter { 
    public: 
    void speak() 
    { 
     printf("Hello from HappyLetter.cpp!\n"); 
    } 
}; 

我相信這個問題是簡單的東西,但我對於要檢查的內容沒有更多的想法。我有一個假設,規則和依賴關係的排序並不重要。

+0

使用[重拍](http://bashdb.sourceforge.net/remake/)'-x'或'讓 - -trace';還可以像[這裏](http://stackoverflow.com/a/20146082/841108)一樣改進你的'Makefile';在重新運行'make'之前嘗試'觸摸HappyLetter.cpp'' – 2015-01-26 20:21:48

+0

在'happy.cpp'附近開始時,你不應該*'#include「HappyLetter.cpp」';你應該有一個'happy.h'頭文件,在'HappyLetter.cpp'和'happy.cpp'中都有'#include「happy.h」'並且修改你的'Makefile' – 2015-01-26 20:27:14

回答

0

正如我說:

首先,你應該(傳統)在不#include "HappyLetter.cpp"happy.cpp(即使是可行的,但可憐的味道)。你應該有一個單獨的文件(與常規include guard

#ifndef HAPPY_INCLUDED 
//// file happy.h 
#define HAPPY_INCLUDED 
    class HappyLetter { 
public: 
    void speak(); 
}; 
#endif /*HAPPY_INCLUDED*/ 

(您可能 - 或者不可─決定,例如在你的happy.h#include <cstdio>class HappyLetter前,有充分的理由這樣做左右逢源! )

那麼你應該有一個第一源文件:

// file happy.cpp 
#include <cstdio> 
#include "happy.h" 
int main() { 
    printf("Hello from happy.cpp!\n"); 
    HappyLetter *myObj = new HappyLetter(); 
    myObj->speak(); 
    delete myObj; 
    return 0; 
} 

順便說一句,你應該使用smart pointers

然後你有你的第二個源文件:

// file happyletter.cpp 
#include <cstdio> 
#include "happy.h" 

void HappyLetter::speak() { 
    printf("Hello from HappyLetter.cpp!\n"); 
} 

最後一個Makefile(見here靈感),如:

# file Makefile 
CXX= g++ 
CXXFLAGS= -std=c++11 -Wall -Wextra -g 
RM= rm -f 
.PHONY: all clean 

all: happy-prog 

clean: 
    $(RM) *.o *~ happy-prog 

happy-prog: happy.o happyletter.o 

happy.o: happy.cpp happy.h 
happyletter.o: happyletter.cpp happy.h 

通知明確依賴於happy.h

正如我評論,考慮使用remake-xmake --trace來調試您的Makefile。請注意,GNU make有很多內置規則,運行make -p來獲取它們。

瞭解更多關於C++11,引人注目的是tutorial,良好的programming in C++書,有一目瞭然到標準(例如n3337草案)。另請閱讀有關make,特別是GNU make

研究用C++編碼的一些現有的free software的源代碼(見sourceforgegithub等等找到一個)。

(所以你有你的兩個C++源文件和Makefile錯了!)

+0

謝謝你的禮貌和全面的回答!我的問題解決了。我會跟進你的學習建議。 – Mark 2015-01-26 21:07:55

+0

出於好奇,你是在用C++學習編程還是在其他語言中教過編程? – 2015-01-26 21:10:10

+0

我最初學習C語言編程 – Mark 2015-01-27 01:24:02