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

341voto

Chris Morris Points 1232

Cette erreur signifie souvent qu'une fonction a une déclaration, mais pas de définition.

Exemple :

// A.hpp
class A
{
public:
  void myFunc(); // Function declaration
};

// A.cpp

// Function definition
void A::myFunc()
{
  // do stuff
}

Dans votre cas, la définition est introuvable. Le problème pourrait être que vous incluez un fichier d'en-tête, qui apporte quelques déclarations de fonctions, mais vous ne :

  1. ne pas définir les fonctions dans votre fichier cpp (si vous avez écrit ce code vous-même)
  2. ne pas inclure le fichier lib/dll qui contient les définitions

Une erreur fréquente consiste à définir une fonction en tant que fonction autonome et à oublier le sélecteur de classe, par ex. A:: dans votre .cpp fichier :

Faux : void myFunc() { /* do stuff */ }
Bien : void A::myFunc() { /* do stuff */ }

4 votes

Comment inclure le dit fichier lib dans mon projet ?

0 votes

@tMJ Cela dépend de l'environnement que vous utilisez. Je chercherais des tutoriels en ligne, ou sur ce site.

0 votes

@ChrisMorris La définition de la fonction n'était pas disponible non pas parce que je ne l'ai pas liée correctement ou autre. Mais, parce que la dll n'était pas en mémoire et devait être chargée via un appel LoadLibrary. (FTR)

32voto

Konrad Points 8333

Vérifiez que vous incluez tous les fichiers sources de votre solution auxquels vous faites référence.

Si vous n'incluez pas le fichier source (et donc l'implémentation) de la classe Field dans votre projet, il ne sera pas construit et vous ne pourrez pas faire de lien pendant la compilation.

Il se peut également que vous utilisiez une bibliothèque statique ou dynamique et que vous ayez oublié d'informer l'éditeur de liens de l'existence de l'adresse de la bibliothèque. .lib s ?

6 votes

La référence aux fichiers lib corrects a résolu le problème. Utilisez Project->Properties->Linker->General->Additional Library Directories et Project->Properties->Linker->Input->Additional Dependencies pour référencer le répertoire lib et les fichiers lib.

0 votes

Dans mon cas, un simple \ dans le fichier *.pro du projet Qt était manquante (elle aurait dû être SOURCES += main.cpp \ pour passer à la ligne suivante).

14voto

Fylix Points 531

Il semble qu'il manque une bibliothèque ou un include, vous pouvez essayer de déterminer quelle classe de votre bibliothèque possède getName, getType etc... et la mettre dans le fichier d'en-tête ou en utilisant #include .

De plus, si ces éléments proviennent d'une bibliothèque externe, assurez-vous d'y faire référence dans votre fichier de projet. Par exemple, si cette classe appartient à abc.lib, alors dans votre fichier Visual Studio

  1. Cliquez sur Propriétés du projet.
  2. Allez dans Propriétés de la configuration, C/C++, Generate, vérifiez que vous pointez vers l'emplacement abc.lib sous Additional Include Directories. Sous Linker, Input, vérifiez que vous avez l'emplacement de abc.lib sous Additional Dependencies.

12voto

Alexey257 Points 101

Je viens de rencontrer le problème suivant : je ne peux pas appeler une fonction de main dans le fichier .cpp, correctement déclarée dans le fichier .h et définie dans le fichier .c. J'ai rencontré une erreur de liaison. En revanche, je peux appeler la fonction à partir du fichier .c habituel. Il est possible que cela dépende de la convention d'appel. La solution a été d'ajouter les lignes preproc suivantes dans chaque fichier .h :

#ifdef __cplusplus
extern "C"
{
#endif

et ceux-ci à la fin

#ifdef __cplusplus
}
#endif

11voto

Gal Bracha Points 1360

J'ai eu une erreur où mon projet a été compilé en tant que x64 et j'ai utilisé un Bibliothèque qui a été compilé en tant que x86 .

J'ai recompilé la bibliothèque en x64 et cela a résolu le problème.

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