web-dev-qa-db-fra.com

Référence indéfinie C++

J'essaie de compiler mon premier programme légitime que je convertis à partir de Java (j'ai exécuté un programme de test hello world pour vérifier mon compilateur et tout fonctionne.) Il existe trois fichiers:

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

La compilation a généré l'erreur suivante:

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

J'utilise Code :: Blocks sur Ubuntu 10.10.

15
Ryan Amos

Vous compilez peut-être skewNormal.cpp dans un fichier .o, mais vous ne l'incluez pas lorsque vous compilez main.cpp.

19
Mark Ransom

Pas sûr que ce soit le problème, mais il semble que vous prototypiez la fonction deux fois. 

La ligne double getSkewNormal(double skewValue, double x); doit uniquement figurer dans l'en-tête, pas dans main.cpp également (car main.cpp inclut skewNormal.h). Le faire apparaître deux fois sous une forme prototype risque de dérouter le compilateur. Le code ne doit être visible qu'une seule fois, généralement dans un en-tête (pas un fichier de code).

Essayez de supprimer cette ligne de main.cpp et de recompiler. :)

1
ssube