Make不会更新可执行文件

时间:2015-01-26 20:18:33

标签: c++ makefile

我写了以下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(包括前者)来创建名为happy的可执行文件。

我可以使用make成功构建代码。但是,当我修改HappyLetter.cpp并输入' make'再次,这种变化没有反映出来。它只适用于我打字“干净”的时候。然后'制作'。我期望发生的目标文件的更新将回显到命令行:

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

然而,HappyLetter.cpp的更新并没有在happy中反映出来。

问题在另一个方向不起作用。也就是说,如果我修改happy.cpp,我会在输入' make'后立即反映更改。

我已经在我的Mac OS X上以及Ubuntu机器上使用三个make二进制文件复制了这个问题。所以我必须在编码中做错事。以下是文件的文本,它们与makefile位于同一目录中:

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");
    }
};

我认为这个问题很简单,但我对于要检查的内容没有更多的想法。我有一个假设是规则和依赖关系的排序无关紧要。

1 个答案:

答案 0 :(得分: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*/

(您可以 - 或者 - 在#include <cstdio>之前决定happy.h中的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;
}

BTW,您应该使用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错误!)