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

3voto

Patrick Nguyen Points 41

Je pense que la plupart des points concernant les causes et les remèdes ont été couverts par tous les contributeurs dans ce fil. Je veux juste souligner que mon problème de "non résolu externe" a été causé par un type de données défini comme macro qui a été substitué différemment de ce qui était attendu, ce qui fait que ce type incorrect est fourni à la fonction en question, et puisque la fonction avec le type n'est jamais définie, il n'aurait pas pu être résolu. En particulier, sous C/C++ -> Language, il y a un attribut appelé "Treat WChar_t As Built in Type", qui aurait dû être défini comme "No (/Zc:wchar_t-)" mais ne l'a pas été dans mon cas.

2voto

Joe Plante Points 2733

J'ai juste eu du mal avec ça. Tout était logiquement mis en place. J'ai déclaré un constructeur mais je ne l'ai pas défini.

class SomeClass
{
   SomeClass();  // needs the SomeClass::SomeClass(){} function defined somewhere, even here
}

J'ai failli me cogner la tête sur mon clavier en oubliant quelque chose d'aussi élémentaire.

2voto

uvts_cvs Points 4163

Ver Erreur des outils de liaison LNK2019 sur MSDN, il y a une liste détaillée des problèmes courants qui causent LNK2019.

2voto

Panouden Points 21

Assurez-vous de décorer vos fichiers d'en-tête avec

#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

De mauvaises choses -y compris ceci- peuvent arriver si vous ne

2voto

Stefan Monov Points 4257

Ce qui l'avait causé dans mon cas :

J'avais un énorme fichier Foo.cpp sans un Foo.h. Foo.cpp a commencé comme ça :

// ... 100 LOC here ...
namespace NS {
// ... 100 more LOC here ...
static int var;

J'ai supprimé le mot-clé "static" et ajouté un fichier Foo.h avec ça :

extern int var;

Vous voyez l'erreur ?

J'ai totalement manqué le fait que var était à l'origine défini dans un espace de nom, parce que la déclaration de l'espace de nom était enterrée dans un autre code. La solution est de changer l'extern comme ceci :

namespace NS {
     extern int var;
}

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