【发布时间】: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 - 供您参考 - 只有标准标题包含在
<>中。在 skewNormal.cpp 中,包含标头应为#include "skewNormal.h"。 (即,用户定义的包含头文件的文件应包含在" "中)。顺便说一句,您得到的不是编译错误,而是链接器错误。