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

1voto

Matthew Hayes Points 123

Je fais du C++ pour la première fois depuis longtemps, et j'obtiens cette erreur lorsque j'oublie d'ajouter le préfixe ClassName: : pour la définition de la fonction, puisque c'est un peu unique au C++. N'oubliez donc pas de vérifier cela aussi !

1voto

Rabel Points 29

POINTERS

J'ai eu ce problème et je l'ai résolu en utilisant le pointeur. Je vois que ce n'était pas votre problème mais j'ai pensé que je devais le mentionner parce que j'aurais aimé qu'il soit là quand j'ai vu ceci il y a une heure. Mon problème était de déclarer une variable membre statique sans la définir (la définition devait venir après d'autres configurations) et bien sûr un pointeur n'a pas besoin de définition. Erreur tout aussi élémentaire :P

1voto

bweber Points 1415

Une cause possible de cette erreur de liaison peut également être inline les fonctions qui sont déclarées mais non définies dans un fichier d'en-tête qui est ensuite inclus ailleurs. Les fonctions en ligne doivent être définies dans chaque unité de traduction dans laquelle elles sont utilisées.

1voto

Beck Points 1

Assurez-vous que vous n'essayez pas de surcharger les opérateurs d'insertion ou d'extraction en tant que fonctions en ligne. J'ai eu ce problème et il n'a disparu que lorsque j'ai supprimé ce mot-clé.

1voto

Flavio Points 90

Une raison possible pour l'erreur "Unresolved external symbol" peut être la convention d'appel de la fonction.

Assurez-vous que tous les fichiers sources utilisent le même standard (.c ou .cpp), ou spécifiez la convention d'appel.

Sinon, si un fichier est un fichier C (source.c) et un autre fichier est un fichier .cpp, et qu'ils sont liés au même en-tête, alors l'erreur "unresolved external symbol" sera levée, parce que la fonction est d'abord définie comme une fonction C cdecl, mais ensuite le fichier C++ utilisant le même en-tête cherchera une fonction C++.

Pour éviter l'erreur "Unresolved external symbol error", assurez-vous que la convention d'appel de la fonction est la même dans tous les fichiers qui l'utilisent.

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