未定义的引用`Math :: addNumbers(int,int)'

时间:2014-02-23 14:59:29

标签: c++ header linker

这是我学习的一个简单的小程序:

这是声明标题:

#ifndef MATH_H
#define MATH_H

class Math
{
    private:
         int result;

    public:

        int addNumbers (int , int);
};

#endif // MATH_H

这是类定义:

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

using namespace std;

int Math::addNumbers(int a , int b)
{
    result = a + b ;
    cout<<result<<endl;

};

这一个是该死的主要;)

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

using namespace std;

int main()
{
    Math myMath;
    myMath.addNumbers(2,9);
};

最后我收到了这个错误:

undefined reference to `Math::addNumbers(int, int)
我应该告诉你: 头文件的名称与我的类名相同,

问题出在哪里?

最好的问候。

Amin khormaei

所以正确的主要应该如下所示:

#include <iostream>
#include "Math.h"
#include "MathDefinition.cpp"

using namespace std;

int main()
{
    Math myMath;
    myMath.addNumbers(2,9);
};

2 个答案:

答案 0 :(得分:0)

问题是您尝试构建的程序缺少Math::addNumbers的定义。这可能是因为您只是尝试构建主源文件 您需要进行此操作,以便定义Math::addNumbers的代码最终链接到您的程序中。为此,您有两个主要选项(假设您的文件名为main.cpp和math.cpp):

  • 您可以修改构建系统以编译math.cpp。这通常被认为是处理这种情况的正确方法。不幸的是,细节取决于您的构建系统或IDE ...
    例如,如果您正在使用gcc,则可以使用以下构建命令将这两个文件链接到二进制文件中:

      

    gcc -o myprogram main.cpp math.cpp

  • 您可以在main.cpp中简单地#include "math.cpp"。这将导致math.cpp的代码在预处理后实际上成为main.cpp的一部分。这通常不是推荐的做法,但与“适当的”解决方案相比,环境特定性较低

答案 1 :(得分:0)

您可能无法正确编译代码。用以下内容编译:

gcc main.cpp math.cpp -o math.o

或更短:

gcc *.cpp -o math.o

这将编译math.cpp和main.cpp文件