2015-01-26 66 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