【问题标题】:Codeblocks c++ undefined reference error, class is definedCodeblocks c++ undefined reference error, class is defined
【发布时间】:2014-08-06 21:15:01
【问题描述】:

大家好,前几天我问了一个关于我无法开始工作的 c++ 代码的问题。我听取了大家关于如何在 C++ 中创建对象的建议,但现在我得到了未定义的引用错误。我正在使用最新的代码块版本并使用它来编译。我已经读过这是由于在编译期间没有链接某些文件引起的,这意味着我已经在头文件中定义了类,但没有在代码中定义,这让我感到困惑,因为根据我的理解(教授示例)我正在声明对象。

头文件 MathObject.h

class MathObject{
private:
    int num1;
    int num2;

public:
    int sum();
    MathObject(int n, int m);
};

MathObject 文件 数学对象.cpp

#include <iostream>
#include "MathObject.h"
using namespace std;

MathObject :: MathObject(int n, int m){
    num1 = n;
    num2 = m;
}

int MathObject :: sum(){
    return num1+num2;
}

主文件

#include <iostream>
#include "MathObject.h"
using namespace std;

int main(int args, char *argv[]){
    MathObject *mo = new MathObject(3,4);
    int sum = mo -> sum();

    MathObject mo2(3,4);

    //cout << sum << endl;
    return 0;
}

未定义的引用适用于对 MathObject 类中任何内容的所有调用,我一直在寻找一个我能理解的小型 c++ 示例。 (语法和java很不一样)

当我尝试在 c 中使用多个文件时会发生这种情况,这可能是我的计算机的问题吗?

【问题讨论】:

  • MathObject.cpp添加到您正在编译的文件中
  • 你是如何构建这个项目的?从命令行?
  • @DrewDormann 和编译器内置的代码块 ide
  • @RedAlert,你的意思是包含语句吗?我以为你只需要包含头文件。
  • 包含语句可能会解决此问题,但这不是您想要解决的方式。您需要将这两个源文件编译为项目的一部分,而不仅仅是 main.cpp

标签: c++ codeblocks linker-errors undefined-reference


【解决方案1】:

修复未定义的引用错误:-

  • 设置 -> 编译器... -> 构建选项 最后标记“将当前编译文件的目录显式添加到编译器搜索目录”

【讨论】:

  • 欢迎来到 Stack Overflow!请注意,您正在回答一个非常古老且已经回答的问题。这是How to Answer 的指南。
【解决方案2】:

您只需在 main.cpp 中添加类的 .cpp 文件即可。

#include <iostream>
#include "MathObject.h"
#include "MathObject.cpp"
using namespace std;

int main(int args, char *argv[]){
    MathObject *mo = new MathObject(3,4);
    int sum = mo -> sum();

    MathObject mo2(3,4);

    //cout << sum << endl;
    return 0;
}

【讨论】:

    【解决方案3】:

    从 code::blocks 论坛找到解决方案:

    -项目->“构建选项

    -确保正确的目标在左侧突出显示;如果您不知道选择项目,请选择第一个。

    -选择选项卡“搜索目录”

    -选择子标签“编译器”

    -“添加”包含标题的文件夹的路径。每行一个文件夹。

    只需将当前文件夹或头文件的位置添加到路径即可。

    链接:http://forums.codeblocks.org/index.php?topic=14713.0

    【讨论】:

      【解决方案4】:

      我试试这个,效果很好!

      MAIN.cpp

      #include <iostream>
      #include "MathObject.h"
      using namespace std;
      
      int main(int args, char *argv[]){
          MathObject *mo = new MathObject(3,4);
          int sum = mo->sum();
      
          MathObject mo2(3,4);
          int sum2 = mo2.sum();
      
          cout << sum << endl;
          cout << sum2 << endl;
          system("pause");
          return 0;
      }
      

      MathObject.h

      class MathObject
      {
      private:
          int num1;
          int num2;
      public:
          MathObject(void);
          ~MathObject(void);
          int sum();
          MathObject(int n, int m);
      };
      

      MathObject.cpp

      #include "MathObject.h"
      
      MathObject::MathObject(void)
      {
      }
      
      MathObject::~MathObject(void)
      {
      }
      int MathObject::sum(){
          return num1+num2;
      }
      MathObject::MathObject(int n, int m){
          num1 = n;
          num2 = m;
      }
      

      编译:

      g++ MathObject.cpp main.cpp -o main.exe
      

      【讨论】:

      • 使用你的,我仍然得到未引用的错误,是我的编译器还是 ide?​​span>
      • 这没有回答问题。 OP 显然在他的编译器上遇到了与你不同的东西,只是断言它“为你工作”并没有帮助解决这种情况。
      • 我忘了评论我是如何编译它的:g++ MathObject.cpp main.cpp -o main.exe
      • 如果你的作品有效,那不意味着我的作品也应该如此吗?我试过用这种方式编译它,但仍然没有
      • 那么您可以提供有关问题的更多详细信息,提供编译器的确切错误或任何线索...
      【解决方案5】:

      在代码块的“项目”选项卡中,右键单击项目名称并选择“添加文件...”

      或者,您可以从应用程序主菜单的“项目”中选择“添加文件...”。

      使用它可以将所有源文件添加到项目中。

      目前MathObject.cpp 从该列表中丢失,因此它没有被编译或链接。

      【讨论】:

      • 奇怪的是,单击“项目”下的“添加文件”没有任何作用。系统或 ide 没有挂起,就好像没有为该选择设置任何操作。
      • 确保您已在 Project > Properties > Build targets > Build target files 下选择了所有必需的文件
      • 如果这不起作用,则右键单击每个文件并单击 add to active project 。然后它会被手动添加到项目中。
      【解决方案6】:
      g++ MathObject.cpp main.cpp -o main
      

      【讨论】:

      • 试过了,这个。我对所有文件所在的文件夹做了一个 cd 并完全按照你的方式输入了你的行,我被告知 g++ 不是一个可识别的命令
      • @MichaelMiner 将MinGW/bin 文件夹的路径添加到PATH 环境变量中。
      • 你的平台\操作系统是什么?这只是您需要包含 MathObject.cpp 文件进行编译的示例。我从 Linux 上运行它,默认情况下它有 g++ 编译器。
      猜你喜欢
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2017-04-30
      • 2013-03-30
      • 2022-12-02
      相关资源
      最近更新 更多