【问题标题】:Makefile cross classes compilationMakefile 跨类编译
【发布时间】:2023-03-10 12:35:01
【问题描述】:

我有一个包含一个主类和 2 个类的生成文件。问题是一个类依赖于另一个类,但是当我这样做时,它无法识别另一个类。这是我的 makefile 中的一个示例。

main : main.o class1.o class2.o
   g++ main.o class1.o class2.o -o main

main.o : main.cpp class1.h class2.h
   g++ -c main.cpp

class2.o : class2.cpp class2.h class1.h
   g++ -c class2.cpp

class1.o : class1.cpp class1.h class2.h
   g++ -c class1.cpp

当我制作时,终端一直告诉我在 class1 中没有 class2 这样的类型,反之亦然。

【问题讨论】:

  • 请发布错误,以及生成错误的命令。无论是失败的编译还是链接,都会产生巨大的差异。但是,我怀疑您在class2.cpp 文件中没有#included class1.h 文件,反之亦然。
  • “它无法识别其他类” - 不管您认为 “It” 是什么,C++ 都不是这样工作的。你让事情为人所知,没有任何认可。
  • 错误是“在从 class1.h:6.0 包含的文件中,来自 main.cpp:1: class2.h:13:12: 错误“Class1”没有命名类型”。正如我之前所说,这两个类的#include 都存在于 cpp 和头文件中(即使它不是必需的)。
  • 如果我更改 makefile 中的顺序,也会发生这种情况。
  • 可能在全局命名空间中没有Class1 类型(符号在C++ 中区分大小写)。指示您的编译器将预处理的输入写入文件以查看发生了什么。并在这里发布一个最小的测试用例。

标签: c++ linux makefile g++


【解决方案1】:

我的朋友,你有一个循环包含。

C++ 讨厌当你在 class2.h 中包含 class1.h 和在 class1.h 中包含 class2.h 时它。

照 Ed Heal 所说的去做,你需要一个前向声明。注意:前向声明并不意味着将#include "blah." 放入对方的头文件中。

前向声明示例:

Class1.h:

class Class2;

Class1 {
  // members and stuff
  Class2 *class2; 
}

Class2.h

#include "Class1.h"

Class2 {
  // members and stuff
  Class1 *class1;
}

看到区别了吗?这很微妙,但很重要。实现应该在.cpp 文件中。

另外,请确保您已准备好头部防护装置。谷歌“标题保护 C++”。这将为您指明正确的方向。

【讨论】:

    【解决方案2】:

    您需要在class1.cppclass2.cpp 中都使用前向声明或#include 头文件

    【讨论】:

    • 我在两个班上都有两样东西。在 class1 中,我有 #include "class2.h",反之亦然。
    • 我将它们包含在 .cpp 和 .h 文件中
    猜你喜欢
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多