2016-11-05 1 views
0

J'ai: frw_trafic.h:Pourquoi compilateur me donne l'erreur "undefined external symbol" quand je n'utilise pas de librairies?

#define PI 3.14159265 

namespace FRW 
{ 
float angleToProperRadians(float angle); 

class Car 
    { 
public: 
... 
void transform(int time = 1); 
... 
private: 
... 
float velocDir; // angle in degrees, same as Sector angle 
float wheelDir; // hence delta angle between car velocity direction and where wheels drive direction 
float centerPosX; 
float centerPosY; //these two are for car position 
... }; } 

est ici un espace de noms avec une classe et une méthode déclarée. frw_traffic.cpp

#ifndef FRWTRAFFIC 
#define FRWTRAFFIC 
#include "frw_traffic.h" 
#endif 

#include <cmath> 

using namespace FRW; 

float angleToProperRadians(float angle) 
{ 
for (; angle < -360 || angle > 360;) 
{ 
    if (angle < -360) 
    { 
     angle = angle + 360; 
     continue; 
    } 
    if (angle > 360) 
    { 
     angle = angle - 360; 
    } 
} 

if (angle < 0) 
{ 
    angle = 360 - angle; 
} 

return angle * PI/180; 
} 
void Car::transform(int time) { 
if (wheelDir == 0) 
{ 
    centerPosX = centerPosX + static_cast<float>(time) * speed * cos(FRW::angleToProperRadians(velocDir)) ; 
    centerPosY = centerPosY + static_cast<float>(time) * speed * sin(FRW::angleToProperRadians(velocDir)) ; 
} } 

Méthode angleToProperRadians() est déclarée dans .h, défini dans la cpp et utilise pour le calcul d'un macro PI, qui est défini dans .h. Ensuite, je calcule la position des objets dans une trajectoire linéaire avec la méthode Car :: tranform(). Il est également déclaré dans un fichier .h dans le cadre d'une classe Car et défini dans le fichier .cpp.

Ce code ne peut pas compiler, ce qui donne le « symbole externe non résolu. » Erreur. AFA c'est une erreur de liaison, je crois que quelque chose est foiré avec des macros ou inclut. J'ai essayé désespérément d'utiliser d'autres questions sur cette erreur ici, sur Stack Overflow, mais la plupart des gens rencontrent cette erreur en utilisant des bibliothèques externes.

S'il vous plaît, quelqu'un, fournir un avis sur ce qu'il faut vérifier deux fois pour voir ce qui est vraiment mal avec ce code.

erreur LNK2019: symbole externe non résolu "float __cdecl FRW :: angleToProperRadians (float)" (? AngleToProperRadians @ FRW @@ YAMM @ Z) référencé dans la fonction "public: void __thiscall FRW :: Car :: transform (int) "(? @ transformer Car @ FRW @@ QAEXH @ Z)

Merci.

+0

angleToProperRadians n'est pas défini dans l'espace de noms. –

+0

Yves Daoust, vous auriez pu le taper comme une réponse. Parce que j'ai mis FRW :: before definition dans .cpp. Devine quoi? Ça a marché! Pourriez-vous, s'il vous plaît, le réécrire comme une réponse pour recevoir des points? –

Répondre

0

En fait, dans ce cas particulier, les macros ne sont pas responsables. La liaison a été effectuée de manière incorrecte car la méthode angleToProperRadians() déclarée dans le fichier .h et définie dans les fichiers .cpp sont des fonctions COMPLETEMENT séparées. En fait, l'un de .h est maintenant dans l'espace de noms FRW. En fait, un de .cpp est maintenant une autre, nouvelle fonction globale. Et "using namespace FRW;" Cela n'aide pas réellement la situation car il est utilisable pour se référer à une méthode déjà définie.

Ce fut une bonne façon de Cpp:

... 
float FRW::angleToProperRadians(float angle) 
{ 
for (...) { 
... 

avis, la façon dont il est à 180 tour lorsque nous sommes d'abord référence à une classe, puis définir sa méthode.

C'est tout. Merci à Yves Daoust d'avoir signalé cela dans un commentaire.