Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未定义的参考C++;_C++_Undefined Reference - Fatal编程技术网

C++ 未定义的参考C++;

C++ 未定义的参考C++;,c++,undefined-reference,C++,Undefined Reference,我正试图编译我从Java转换的第一个合法程序(我运行了一个测试hello world类型的程序来检查我的编译器,它可以正常工作)。 有三个文件: main.cpp #include <iostream> #include "skewNormal.h" using namespace std; double getSkewNormal(double, double); int main(int argc, char **argv) { cout << getS

我正试图编译我从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;
}
#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)'

我在Ubuntu10.10上使用Code::Blocks。

不确定这是否是问题所在,但似乎您正在两次原型化该函数

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


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

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

您正在运行的编译器命令是什么?@Kerrek SB:他正在使用和IDE,它应该已经负责链接所有内容。嗯,很难说,但错误看起来像链接器,而不是编译器错误。试试这个:
g++-o prog main.cpp skewNormal.cpp
,只是为了确定一下。@delnan,我使用了一个IDE,但我仍然必须告诉它我的项目中有什么…@Somanayr-仅供参考-只有标准标题包含在
中。在skewNormal.cpp中,include标题应为
#include“skewNormal.h”
。(即,用户定义的包含头文件应包含在
”中)。顺便说一句,你得到的不是编译错误,而是链接器错误。我试过了。我一开始真的把它弄出来了,但后来加了进去,看看它是否会改变什么。再试一次,它仍然无法工作:您是否在同一个项目中有所有3个文件,并且正在编译这两个cpp文件?更改时会出现什么错误?鉴于此处的错误消息(完整错误)引用了.o文件,Mark的答案很可能是您的解决方案。请详细解释?我看到了a/obj/Debug/main.o,但没有看到skewNormal.o。看不到其他*.o文件。@Somanayr,这意味着您根本没有编译sknewNormal.cpp。你需要解决这个问题。啊哈。谢谢:D它本来是要建造的,但是没有建造的地方。我的意思是,它给出了一个放置构建文件的位置列表,而我没有选择任何一个!我真傻。谢谢你的帮助!