我收到“未定义的引用”错误,我不明白为啥(C++ OO)

Posted

技术标签:

【中文标题】我收到“未定义的引用”错误,我不明白为啥(C++ OO)【英文标题】:I'm getting "undefined reference" errors and I don't understand why (C++ OO)我收到“未定义的引用”错误,我不明白为什么(C++ OO) 【发布时间】:2017-06-15 17:46:49 【问题描述】:

我查看了有关未定义引用错误的多个其他帖子,但在我的代码中看不到任何错误。有什么我没抓到的吗?我在 ubuntu 命令行中使用 g++ 编译。

这是我的代码和来自终端的错误:

Main.cpp:

#include <iostream>
#include "Object.h"

using namespace std;


int main()
    Object* o = new Object(3,6,9);
    o->printVolume();
    delete o;
    return 0;

对象.h:

#ifndef OBJECT_H_
#define OBJECT_H_

class Object

public:
    Object(double xSize, double ySize, double zSize);   
    ~Object();
    void printVolume();
private:
    double x,y,z;
;

#endif

对象.cpp:

#include <iostream>
#include "Object.h"


using namespace std;

Object::Object(double xSize, double ySize, double zSize)
    x = xSize;
    y = ySize;
    z = zSize;


Object::~Object()
    cout << "Object destroyed." << endl;


void Object::printVolume()
    cout << x * y * z << endl;

错误:

/tmp/ccUeuPTn.o: 在函数main': Main.cpp:(.text+0x47): undefined reference toObject::Object(double, double, double)' Main.cpp:(.text+0x57): 未定义引用Object::printVolume()' Main.cpp:(.text+0x68): undefined reference toObject::~Object()' collect2:错误:ld 返回 1 个退出状态

我有什么遗漏的吗?

【问题讨论】:

你是怎么编译的? 终端中的g++ 我运行这个:~/Desktop/C++ Projects/Forge/src$ g++ -I../include Main.cpp -o Main.o 你忘记编译和链接Object.cpp 你如何将 Object.o 链接到你的主目录? 【参考方案1】:

编译似乎已成功,并且这些错误似乎是由链接器(或某种其他类型的编译后步骤)产生的,它们告诉您您的 Object::Object(double xSize, double ySize, double zSize) 构造函数无处可寻。

通过在Main.cpp 中包含Object.h 来让编译器知道你的对象是不够的;这将导致编译成功,但这只是故事的一半。

故事的另一半是链接也必须成功,因此您必须在链接期间以某种方式使Object.oMain.o 可用。

【讨论】:

谢谢,我是 linux 新手,并且在没有 IDE 的情况下进行编译,所以我不知道构建步骤中到底发生了什么,我将研究链接以及如何做到这一点! 好。祝你好运,但如果你需要我的建议,不要在没有 IDE 的情况下尝试。这就像试图用回形针建造埃菲尔铁塔。可以做到,但会很痛。

以上是关于我收到“未定义的引用”错误,我不明白为啥(C++ OO)的主要内容,如果未能解决你的问题,请参考以下文章

编译具有相同标头的 C 和 C++ 文件时未定义的引用

包含Rcpp.h时未定义的引用错误

为啥在这种情况下编译器会抛出“未定义的引用...”错误?

我不明白为啥我的消息没有发送给每个决定收到通知的用户。它只发送给一个

C++ IrrKlang 声音错误- CreateIrrKlangDevice() 导致未定义的引用(真正的长引用)

为啥我收到此错误? KeyError:“没有”