【问题标题】:Undefined reference C++未定义的参考 C++
【发布时间】:2011-09-11 04:48:00
【问题描述】:

我正在尝试编译我从 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 上使用 Code::Blocks。

【问题讨论】:

  • 您正在运行的编译器命令是什么?
  • @Kerrek SB:他正在使用 IDE,它应该已经负责链接所有内容。
  • 嗯,很难说,但错误看起来像链接器,而不是编译器错误。试试这个:g++ -o prog main.cpp skewNormal.cpp,只是为了确定。
  • @delnan,我使用 IDE,但我仍然需要告诉它我的项目中有什么......
  • @Somanayr - 供您参考 - 只有标准标题包含在 &lt;&gt; 中。在 skewNormal.cpp 中,包含标头应为 #include "skewNormal.h"。 (即,用户定义的包含头文件的文件应包含在 " " 中)。顺便说一句,您得到的不是编译错误,而是链接器错误

标签: c++ undefined-reference


【解决方案1】:

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

double getSkewNormal(double skewValue, double x); 行只需要在标题中,而不是在 main.cpp 中(因为 main.cpp 包含 skewNormal.h)。让它以原型形式出现两次似乎会使编译器感到困惑。您只需要它对代码可见一次,通常应该在标题中(而不是代码文件)。

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

【讨论】:

  • 我试过了。我实际上一开始就把它弄出来了,但把它加进去看看它是否会改变什么。再试一次还是不行:pastie.org/private/wt2oyt9v6pffcymuenabww
  • 您是否在同一个项目中拥有所有 3 个文件,并且您是否正在编译这两个 cpp 文件?改的时候报什么错?
  • 鉴于那里的错误消息(完整错误)是引用 .o 文件,马克的答案可能是您的解决方案。
【解决方案2】:

您可能正在将 skewNormal.cpp 编译为 .o 文件,但在编译 main.cpp 时并未包含它。

【讨论】:

  • 解释更多?我看到 /obj/Debug/main.o 但没有 skewNormal.o。看不到其他 *.o 文件。
  • @Somanayr,这意味着您甚至根本没有编译 sknewNormal.cpp。你需要解决这个问题。
  • 啊哈。谢谢 :D 它被设置为构建,但没有构建的地方。我的意思是它提供了一个放置构建文件的位置列表,而我没有选择它们!傻我。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
相关资源
最近更新 更多