222 votes

Symbole externe non résolu dans les fichiers d'objets

Pendant le codage dans Visual Studio, j'ai reçu une erreur de symbole externe non résolu. et je n'ai aucune idée de ce qu'il faut faire. Je ne sais pas ce qui ne va pas. Pourriez-vous me décrypter ? Où dois-je chercher quel type d'erreur ?

1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" (?addField@Field@@QAEPAV1@PAV1@@Z) referenced in function "public: void __thiscall Form::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Form@@QAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Field::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Field@@UAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: __thiscall InputField::InputField(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (??0InputField@@QAE@AAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::prompt(void)" (?prompt@Field@@UAEXXZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getName(void)" (?getName@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getType(void)" (?getType@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::describe(void)" (?describe@Field@@UAEXXZ)
1>C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals

39 votes

Un symbole non résolu est un symbole que vous avez déclaré quelque part mais que vous n'avez jamais défini. En général, cela signifie que vous avez #inclus le fichier d'en-tête d'une bibliothèque tierce mais que vous n'avez pas indiqué à l'éditeur de liens où trouver les fichiers .obj correspondants à la bibliothèque.

10 votes

L'erreur la plus fréquente est de définir une fonction en tant que fonction autonome et d'oublier le sélecteur de classe dans le formulaire de demande. .cpp fichier : Vous faites ça (mal) : void myFunc() { /* do stuff */ } Au lieu de cela (à droite) : void A::myFunc() { /* do stuff */ }

0 votes

Vous pouvez également ajouter des parenthèses directement dans votre fichier de données. en-tête si vous ne voulez pas le définir davantage dans votre fichier .cpp, comme ça : void myFunc() {}; .

7voto

Shashank Points 71

Parfois, si un nouveau fichier d'en-tête est ajouté, et que cette erreur commence à se produire à cause de cela, vous devez ajouter la bibliothèque également pour vous débarrasser de l'erreur. unresolved external symbol .

par exemple :

#include WtsApi32.h

aura besoin :

#pragma comment(lib, "Wtsapi32.lib")

7voto

meJustAndrew Points 2566

J'ai eu les mêmes erreurs de lien, mais à partir d'un projet de test qui faisait référence à une autre dll. J'ai découvert qu'après avoir ajouté _declspec(dllexport) devant chaque fonction qui était spécifiée dans le message d'erreur, le lien fonctionnait bien.

6voto

Joshua R C Points 23

Cette erreur peut être provoquée en plaçant les définitions de fonctions d'une classe modèle dans un fichier .cpp distinct. Pour une classe modèle, les fonctions membres doivent être déclarées dans le fichier d'en-tête. Vous pouvez résoudre ce problème en définissant les fonctions membres en ligne ou juste après la définition de la classe dans le fichier .h.

Par exemple, au lieu de placer les définitions de fonctions dans un fichier .cpp comme pour les autres classes, vous pouvez les définir en ligne comme ceci :

template<typename T>
MyClassName {
  void someFunction() {
    // Do something
    ...
  }
  void anotherFunction() {
    // Do something else
    ...
  }
}

Ou vous pouvez les définir après la définition de la classe mais dans le même fichier, comme ceci :

template<typename T>
MyClassName {
  void someFunction();
  void anotherFunction();
}

void MyClassName::someFunction() {
  // Do something
  ...
}
void MyClassName::anotherFunction() {
  // Do something else
  ...
}

J'ai juste pensé que je devais partager cela puisque personne d'autre ne semble avoir mentionné les classes de modèles. C'était la cause de l'erreur dans mon cas.

5voto

Johann Studanski Points 121

Encore un autre problème possible (sur lequel je me suis gratté la tête pendant un certain temps) :

Si vous définissez vos fonctions comme inline ils doivent, bien entendu, être définis dans le cadre de la politique de l'UE. en-tête (ou un en ligne ), et non un cpp .
Dans mon cas, ils étaient dans un fichier en ligne, mais seulement parce qu'il s'agissait d'une implémentation spécifique à une plateforme, et qu'un fichier de type cpp a inclus ce correspondant inl au lieu d'un en-tête. Ouais, ça arrive.

J'ai pensé que je devais laisser ceci ici aussi, peut-être que quelqu'un d'autre rencontre le même problème et le trouve ici.

3voto

GMLewisII Points 326

En plus de l'excellente réponse de Chris Morris ci-dessus, j'ai trouvé une façon très intéressante de recevoir cette même faute si vous appelez une méthode virtuelle qui n'a pas été définie comme pure mais qui n'a pas sa propre implémentation. C'est exactement la même raison (le compilateur ne peut pas trouver une implémentation de la méthode et donc se trompe), mais mon IDE n'a pas du tout détecté cette faute.

par exemple, le code suivant obtiendrait une erreur de compilation avec le même message d'erreur :

//code testing an interface
class test
{
   void myFunc(); 
}

//define an interface
class IamInterface
{
    virtual void myFunc();
}

//implementation of the interface
class IamConcreteImpl
{
    void myFunc()
    {
       1+1=2;
    }
}

Cependant, en changeant IamInterface myFunc() en une méthode virtuelle pure (une méthode qui "doit" être implémentée, plutôt qu'une méthode virtuelle qui est une méthode qui "peut" être surchargée), on élimine l'erreur de compilation.

//define an interface
class IamInterface
{
    virtual void myFunc() = 0;
}

J'espère que cela aidera la prochaine personne de StackOverFlow à se frayer un chemin dans le code !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X