Undefined reference C++
J'essaie de compiler mon premier programme légitime que je suis la conversion de Java (j'ai couru un test hello world type de programme pour vérifier mon compilateur et ça marche).
Il y a 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 donné le message d'erreur suivant:
main.cpp:9: undefined reference to `getSkewNormal(double, double)'
J'utilise Code::Blocks sous Ubuntu 10.10.
Quelle est la commande du compilateur que vous utilisez?
SB: Il est de l'aide et de l'IDE et il devrait déjà prendre soin de lier le tout.
Hum, difficile à dire, mais l'erreur ressemble à un éditeur de liens, pas d'erreur du compilateur. Essayez ceci:
Je utiliser un IDE, mais j'ai encore à dire ce qui est dans mon projet...
Pour votre info, Seuls les en-têtes sont enfermés dans
SB: Il est de l'aide et de l'IDE et il devrait déjà prendre soin de lier le tout.
Hum, difficile à dire, mais l'erreur ressemble à un éditeur de liens, pas d'erreur du compilateur. Essayez ceci:
g++ -o prog main.cpp skewNormal.cpp
, juste pour être sûr.Je utiliser un IDE, mais j'ai encore à dire ce qui est dans mon projet...
Pour votre info, Seuls les en-têtes sont enfermés dans
<>
. Dans skewNormal.cpp, y compris l'en-tête doit être #include "skewNormal.h"
. ( c'est à dire, défini par l'utilisateur en-tête inclus les fichiers doivent être placés dans " "
). BTW, ce que vous avez n'est pas une erreur de compilation mais c'est un erreur liens.OriginalL'auteur Ryan Amos | 2011-06-08
Vous devez vous connecter pour publier un commentaire.
Vous pouvez compiler skewNormal.cpp à un .o fichier, mais vous n'êtes pas, y compris lorsque vous compilez main.cpp.
Expliquer plus? Je vois un /obj/Debug/main.o mais pas de skewNormal.o. Aucun autre *.o fichiers en vue.
cela signifie que vous n'êtes même pas compiler sknewNormal.cpp à tous. Vous devez corriger l'erreur.
Aha. Merci 😀 Il a été mis en place, mais il n'y avait aucun endroit où construire. Ce que je veux dire par là c'est qu'il donne une liste des endroits pour mettre les fichiers de compilation, et j'avais choisi aucun d'eux! Je suis bête. Merci pour l'aide!
OriginalL'auteur Mark Ransom
Ne sais pas si c'est le problème, mais il semble que vous êtes le prototype d'une fonction deux fois.
La
double getSkewNormal(double skewValue, double x);
ligne seulement besoin d'être dans l'en-tête, pas dans main.cpp (depuis main.cpp comprend skewNormal.h). Avoir il apparaisse deux fois dans une forme de prototype semble susceptible de confondre le compilateur. Vous avez seulement besoin d'être visible pour le code une fois, et généralement, cela doit être dans l'en-tête (pas un fichier de code).Essayer d'enlever cette ligne de main.cpp et recompiler. 🙂
Avez-vous tous les 3 fichiers dans le même projet et êtes-vous de la compilation de deux fichiers cpp? Quelle erreur est donnée lorsque vous changer?
La même erreur: pastie.org/2039464
Étant donné que le message d'erreur (l'erreur totale) est le référencement .o fichier, la Marque, la réponse est probablement votre solution.
OriginalL'auteur ssube