2010-07-29 6 views
1

aidez-moi s'il vous plaît, j'ai un problème étrange que je ne peux pas résoudre en aucune façon. Prémisse: J'utilise Visual C++ 2005 sur Windows 7 x64, et je suis sûr que mon code n'est pas fatalement défectueux car avec g ++ sous Linux il fonctionne bien.Problème de liaison étrange avec Visual C++ 2005

Je développe une application qui utilise une bibliothèque statique également développée par moi.

Dans la phase de liaison de l'application, j'obtiens deux mystérieuses erreurs LNK2019.

C'est l'en-tête de l'une des classes de la bibliothèque:

namespace sulfur 
{ 
class Quark 
{ 
public: 
... various methods 
void addAccel(const Vec2 &a); 
... various methods 
private: 
... various data 
}; 
} 

Il est évident que dans le fichier cpp i fournir une implémentation pour addAccel avec exactement la même signature.

Lorsque j'essaie de lier l'application à la bibliothèque, toutes les autres fonctions membres sont trouvées, à l'exception de addAccel.

Les recherches de l'éditeur de liens pour le symbole "? AddAccel @ Quark @@ QAEXABV? $ TemplateVec2 @ M @ Z Atlax @@@"

alors que dans le fichier .lib il y a (que je trouve en utilisant dumpbin) " ? addAccel @ Quark @ soufre @@ QAEXABV? $ TemplateVec2 @ M @ Atlax @@@ Z ". La seule différence ici est que l'éditeur de liens recherche un nom tronqué sans la partie espace de noms et je ne sais pas pourquoi.

J'ai essayé de changer le nom, la position, la convention d'appel et la signature de la métode mais en vain, obtenant toujours la même erreur.

La deuxième erreur est très similaire. J'ai un autre en-tête dans la bibliothèque:

namespace sulfur 
{ 
class Cluster 
{ 
... 
Quark *addQuark(sulfur::Feature feat, float x, float y, float m=0.1f, float aF=0.01f); 
... 
}; 
} 

et un fichier d'implémentation correct est fourni. Comme avant, toutes les autres méthodes sont liées correctement, mais pas addQuark.

Les recherches de l'éditeur de liens pour "? AddQuark @ Cluster @ soufre @@ QAEPAVQuark @@ W4Feature @ 2 @ MMMM @ Z"

mais dans la bibliothèque, il est « ? AddQuark @ Cluster @ soufre @@ QAEPAVQuark @ 2 @ W4Feature @ 2 @ MMMM @ Z ".

Cette fois la différence est l'absence du premier '2' entre le '@' dans la version que le compilateur recherche.

Ce n'est pas la première fois que je compile cette application avec Visual Studio et elle a toujours été connectée correctement sauf pour cette fois avec les dernières modifications.

Je n'ai pas la moindre idée, merci d'avance

+0

Si vous exécutez les deux derniers via undname.exe vous verrez que c'est en fait la même erreur - l'une est une méthode sur 'la classe Quark' et l'autre sur' la classe de soufre :: Quark'. – Rup

+0

Oui mais je ne peux pas imaginer pourquoi l'éditeur de liens recherche une classe Quark en dehors de l'espace de noms car elle n'existe même pas. – Mitridas

Répondre

1

Où et comment est la fonction void addAccel(const Vec2 &a); mise en œuvre? Êtes-vous sûr de ne pas manquer le préfixe Quark:: sur l'implémentation de la fonction?

+0

L'implémentation d'addAccel se trouve dans le fichier Quark.cpp comme toutes les autres méthodes de la classe et est implémentée comme suit: vide soufre :: Quark :: addAccel (const Vec2 & a) { force + = masse * a; cluster-> wakeUp(); Je l'appelle à partir de l'application comme ceci: Vec2 power (...); state.selQ-> addAccel (puissance); Où state.selQ est de type Quark * . – Mitridas

0

Eh bien, je viens de résoudre le problème. Il y avait deux déclarations forward erronées (en dehors de l'espace de noms) de la classe Quark et de la classe Cluster. Pour une raison quelconque, g ++ était d'accord, alors que VC++ avait raison de s'en plaindre. Merci quand même.

Questions connexes