未定义的引用C++

Undefined reference C++

本文关键字:C++ 引用 未定义      更新时间:2023-10-16

我正在尝试编译我从Java转换的第一个合法程序(我运行了一个测试hello-world类型的程序来检查我的编译器,它可以工作)。有三个文件:

main.cpp

#include <iostream>
#include "skewNormal.h"
using namespace std;
double getSkewNormal(double, double);
int main(int argc, char **argv) {
    cout << getSkewNormal(10.0, 0.5) << endl;
}

skewNormal.cpp

#define _USE_MATH_DEFINES
#include <iostream>
#include <math.h>
using namespace std;
#include <skewNormal.h>
double SkewNormalEvalutatable::evaluate(double x)
{
    return 1 / sqrt(2 * M_PI) * pow(M_E, -x * x / 2);
}
SkewNormalEvalutatable::SkewNormalEvalutatable()
{
}
double sum (double start, double stop,
                               double stepSize,
                               Evaluatable evalObj)
{
  double sum = 0.0, current = start;
  while (current <= stop) {
    sum += evalObj.evaluate(current);
    current += stepSize;
  }
  return(sum);
}
double integrate (double start, double stop,
                                     int numSteps,
                                     Evaluatable evalObj)
{
  double stepSize = (stop - start) / (double)numSteps;
  start = start + stepSize / 2.0;
  return (stepSize * sum(start, stop, stepSize, evalObj));
}
double getSkewNormal(double skewValue, double x)
{
  SkewNormalEvalutatable e;
  return 2 / sqrt(2 * M_PI) * pow(M_E, -x * x / 2) * integrate(-1000, skewValue * x, 10000, e);
}

skewNormal.h

#ifndef SKEWNORMAL_H_INCLUDED
#define SKEWNORMAL_H_INCLUDED
class Evaluatable {
public:
  virtual double evaluate(double x);
};
class SkewNormalEvalutatable : Evaluatable{
public:
  SkewNormalEvalutatable();
  double evaluate(double x);
};
double getSkewNormal(double skewValue, double x);
double integrate (double start, double stop, int numSteps, Evaluatable evalObj);
double sum (double start, double stop, double stepSize, Evaluatable evalObj);
#endif // SKEWNORMAL_H_INCLUDED

编译产生以下错误:

main.cpp:9: undefined reference to `getSkewNormal(double, double)'

我在Ubuntu 10.10上使用代码::块。

您可能正在将skewNormal.cpp编译到.o文件,但在编译main.cpp.

时没有将其包含在内

不确定这是否是问题所在,但似乎您对函数进行了两次原型设计。

double getSkewNormal(double skewValue, double x);行只需要在头中,而不需要在main.cpp中(因为main.cpp包括shakeNormal.h)。以原型形式出现两次似乎会混淆编译器。您只需要它对代码可见一次,通常它应该在标头(而不是代码文件)中。

请尝试从main.cpp中删除该行并重新编译。:)