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() {}; .

0voto

Jerry Miller Points 109

Je suis venu ici pour chercher une explication possible avant de regarder de plus près les lignes précédant l'erreur de linker. Il s'est avéré qu'il s'agissait d'un exécutable supplémentaire pour lequel la déclaration globale était manquante !

0voto

Lisedra Points 1

Je viens d'avoir la même erreur et j'arrive à l'éviter en remplaçant ; avec {} dans le fichier d'en-tête.

#ifndef XYZ_h
#define XYZ_h
class XYZ
{
    public:
    void xyzMethod(){}
}
#endif

Quand il a été void xyzMethod(); il ne voulait pas compiler.

0voto

J'ai rencontré un problème similaire et j'ai finalement réussi à le résoudre en ajoutant __declspec(dllimport) à la déclaration de la classe :

// A.hpp
class __declspec(dllimport) A
{
   public: void myFunc();

   // Function declaration
};

0voto

Zodman Points 329

Dans mon cas, j'avais plusieurs espaces de noms dans mon fichier d'en-tête sans imbrication (un après l'autre), mais dans mon fichier source, j'avais accidentellement imbriqué un des espaces de noms dans un autre :

// myExample.h

#ifndef MYEXAMPLE_H
#define MYEXAMPLE_H

namespace A
{
  void aFunc();
}

namespace B
{
  void bFunc();
}

// myExample.cpp

#include "myExample.h"

namespace A
{
  void aFunc()
  {
    ...
  }

  namespace B   // whoops! I nested this inside namespace A when I didn't mean to.
  {
    void bFunc()
    {
      ...
    }
  }
}

// main.cpp

#include "myExample.h"

int main()
{
  myExample::B::bFunc();

  return 0;
}

Lorsque j'ai utilisé F12 pour "Aller à la définition" sur la fonction dans Main, Visual Studio a trouvé le code dans le fichier source même s'il a été déclaré dans un espace de noms plus profond par accident.

Technique de débogage

J'ai repéré le problème en renommant la fonction alors que j'essayais de déboguer le problème. La fenêtre de prévisualisation du renommage a montré un nœud "External References" avec la fonction dans le fichier source clairement imbriquée dans un autre espace de nom par accident.

0voto

Patrick G Points 3

J'ai eu le même problème. Le mien fonctionnait un jour et ne fonctionnait plus le jour suivant après avoir sorti le dernier code.

Le dernier code n'incluait pas le projet auquel je faisais référence dans ma bibliothèque. Donc, lorsque j'ai reconstruit ma bibliothèque, il a supprimé le fichier .obj, whoopsy......

J'ai réinclus le projet dont j'avais besoin, j'ai construit ma bibliothèque, puis j'ai reconstruit le projet qui avait échoué et tout s'est bien passé.

Morale de l'histoire, vérifiez que votre fichier .obj est bien là où vous le référencez avant de plonger trop profondément dans le trou du lapin.

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