【问题标题】:Why do I get an Undefined reference error when trying to compile? [duplicate]为什么在尝试编译时出现未定义的引用错误? [复制]
【发布时间】:2021-12-28 17:20:47
【问题描述】:

只是遇到了一个小问题,我还没有弄清楚。 我在另一个项目中使用了类似的程序结构,但问题归结为这一点。我有两个 cpp 文件,分别是:

Trading_dte.cpp:

#include <iostream>
using namespace std;
class Dte
{
    public:
    int addition(int a, int b)
    {
        return a + b;
    }
};

dummy.cpp:

#include <iostream>
#include "Trading_dte.hpp"

Dte obj;

int check()
{
    std::cout<<obj.addition(6,9);
}

我创建了一个名为 Trading_dte.hpp 的头文件:

# pragma once
#include <iostream>

class Dte
{
    public:
    int addition(int a, int b);
}; 

现在当我尝试使用以下命令进行编译时:

g++ Trading_dte.cpp dummy.cpp

我得到了错误:

/usr/bin/ld: /tmp/ccCcM8R6.o: in function `check':
dummy.cpp:(.text+0x1a): undefined reference to `Dte::addition(int, int)'
collect2: error: ld returned 1 exit status

我敢肯定这是小事,但我就是想不通。 提前非常感谢!

【问题讨论】:

    标签: c++ oop undefined


    【解决方案1】:

    您的 cpp 文件需要以不同的方式编写

    #include "Trading_dte.hpp"
    #include <iostream>
    
    int Dte::addition(int a, int b)
    {
      return a + b;
    }
    

    【讨论】:

    • 我正在努力寻找一个好的 SO 答案/博客文章/解释为什么这是正确的做法。
    • @orhtej2 类声明在标头中,在 .cpp 中的实现,或者您可以将所有内容都放在标头中。
    【解决方案2】:

    您创建了两个独立的Dte 类,一个对main 可见,另一个仅在Trading_dte.cpp 中可见。在Trading_dte.hpp 中定义的main 可见的有addition 成员函数的声明,但没有定义。

    可能最简单的做法是删除Trading_dte.cpp 并将实现放入Trading_dte.hpp 中的类定义中。

    Trading_dte.hpp:

    # pragma once
    
    class Dte
    {
        public:
        int addition(int a, int b)
        {
            return a + b;
        }
    };
    

    请注意,我还删除了 #include &lt;iostream&gt; 行。你不需要在头文件中使用它,因为你没有在类中使用它。

    【讨论】:

      猜你喜欢
      • 2015-07-11
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      相关资源
      最近更新 更多