使不更新可执行文件

Make Does Not Update Executable

本文关键字:可执行文件 更新      更新时间:2023-10-16

我写了下面的制作文件:

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机器上复制了三个制作二进制文件。所以我一定在编码中做错了什么。以下是文件的文本,它们与生成文件位于同一目录中:

快乐.cpp

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

快乐信.cpp

#include <cstdio>
class HappyLetter {
  public:
    void speak()
    {
      printf("Hello from HappyLetter.cpp!n");
    }
};

我相信问题很简单,但我对检查什么没有更多的想法。我的一个假设是规则和依赖项的顺序无关紧要。

正如我评论的那样:

首先,你不应该(传统上)在你的happy.cpp#include "HappyLetter.cpp"(即使这是可行的,但品味很差)。您应该有一个单独的头文件(使用常规的包含保护)

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

(您可以 - 也可以不 - 决定例如 #include <cstdio>class HappyLetter前的happy.h;有充分的理由做到这两种方式!

然后你应该有第一个源文件:

// 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;
}

顺便说一句,你应该使用智能指针!

然后你有第二个源文件:

 // file happyletter.cpp
 #include <cstdio>
 #include "happy.h"
 void HappyLetter::speak() {
  printf("Hello from HappyLetter.cpp!n");
 }

最后,一个Makefile(见这里获得灵感),比如:

 # 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的信息,特别是教程,C++书中的良好编程,浏览一下标准(例如n3337草案)。另请阅读有关make的信息,特别是GNU make。

研究一些用C++编码的现有自由软件的源代码(参见sourceforge或github等)。

(所以你把C++源文件和Makefile都弄错了!