Неопределенная ссылка C ++

Я пытаюсь скомпилировать свою первую законную программу, которую я конвертирую с Java (я запустил тестовую программу hello world type для проверки моего компилятора, и он работает). Существует три файла:

main.cpp

 #include  #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  #include  using namespace std; #include  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)' 

Я использую Code :: Blocks на Ubuntu 10.10.

Вы можете компилировать skewNormal.cpp в файл .o, но вы не включаете его при компиляции main.cpp.

Не уверен, что это проблема, но кажется, что вы прототипируете функцию дважды.

double getSkewNormal(double skewValue, double x); строка должна находиться только в заголовке, а не в main.cpp (так как main.cpp включает skewNormal.h). Если он появляется дважды в форме прототипа, похоже, смущает компилятор. Вам нужно только, чтобы он был видимым для кода один раз, и обычно это должно быть в заголовке (а не в файле кода).

Попробуйте удалить эту строку из main.cpp и перекомпилировать. 🙂

Давайте будем гением компьютера.