web-dev-qa-db-fra.com

Symbole externe non résolu dans les fichiers objet

Lors du codage dans Visual Studio, une erreur de symbole externe non résolue s'est produite et je ne sais pas quoi faire. Je ne sais pas ce qui ne va pas. Pourriez-vous s'il vous plaît me déchiffrer? Où devrais-je chercher quel type d'erreurs?

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
167
Novellizator

Cette erreur signifie souvent qu'une fonction a une déclaration, mais pas une 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 peut être que vous incluez un fichier d'en-tête, qui apporte certaines déclarations de fonction, mais vous pouvez aussi:

  1. ne définissez pas les fonctions dans votre fichier cpp (si vous avez écrit ce code vous-même)
  2. n'incluez pas le fichier lib/dll contenant les définitions

Une erreur courante est que vous définissez une fonction en tant qu'entité autonome et oubliez le sélecteur de classe, par exemple. A::, dans votre fichier . Cpp :

Wrong:void myFunc() { /* do stuff */ }
Right:void A::myFunc() { /* do stuff */ }

284
Chris Morris

Vérifiez que vous incluez tous les fichiers source dans votre solution que vous référencez.

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 créer de lien lors de la compilation.

Sinon, vous utilisez peut-être une bibliothèque statique ou dynamique et vous avez oublié de dire à l'éditeur de liens le .libs?

23
Konrad

Il semble manquer une bibliothèque ou une inclusion, 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, s’ils proviennent d’une bibliothèque externe, veillez à les référencer dans votre fichier de projet. Par exemple, si cette classe appartient à un abc.lib, alors dans votre Visual Studio

  1. Cliquez sur Propriétés du projet.
  2. Allez dans Propriétés de la configuration, C/C++, Générer, vérifiez que vous pointez sur l'emplacement abc.lib sous Répertoires d'inclusion supplémentaires. Sous Linker, Input, assurez-vous que abc.lib est sous Dependencies supplémentaires.
11
Fylix

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

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

7
Gal Bracha

Je viens de voir le problème je ne peux pas appeler une fonction de main dans un fichier .cpp, correctement déclarée dans un fichier .h et définie dans un fichier .c. A rencontré une erreur de l'éditeur de liens. En attendant je peux appeler la fonction du fichier .c habituel. Cela dépend peut-être de la convention d'appel. La solution consistait à ajouter les lignes de préproc suivantes dans chaque fichier .h:

#ifdef __cplusplus
extern "C"
{
#endif

et ceux-ci à la fin

#ifdef __cplusplus
}
#endif
7
Alexey257

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

4
meJustAndrew

Je crois que la plupart des points concernant les causes et les remèdes ont été couverts par tous les contributeurs à ce fil. Je souhaite simplement signaler que mon problème "externe non résolu" est dû à un type de données défini en tant que macro qui est substitué différemment que prévu, ce qui a pour conséquence que ce type incorrect est fourni à la fonction en question, et depuis la fonction avec type n'est jamais défini, il n'a pas pu être résolu. En particulier, sous C/C++ -> Langage, il existe un attribut appelé "Traiter WChar_t en tant que type intégré, qui aurait dû être défini comme" Non (/ Zc: wchar_t-) "mais ne l’a pas été dans mon cas.

3
Patrick Nguyen

parfois, si un nouveau fichier d'en-tête est ajouté et que cette erreur commence à arriver, vous devez également ajouter une bibliothèque pour vous débarrasser de unresolved external symbol.

par exemple:

#include WtsApi32.h

aura besoin:

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

En plus de l'excellente réponse de Chris Morris ci-dessus, j'ai trouvé un moyen très intéressant de recevoir le même défaut si vous appelez une méthode virtuelle qui n'a pas été définie comme pure, mais ne possède 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 des escrocs), mais mon IDE n'a pas attrapé cette erreur le moins du monde.

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, changer IamInterface myFunc () pour qu'il devienne une méthode virtuelle pure (une méthode qui "doit" être implémentée, sera plus efficace qu'une méthode virtuelle qui est une méthode qui "peut être remplacée") éliminera l'erreur de compilation.

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

Espère que cela aide la prochaine personne de StackOverFlow à parcourir le code!

2
GMLewisII

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 cela - peuvent arriver si vous ne le faites pas

2
Panouden

Une cause possible de cette erreur de l'éditeur de liens peut également être inline fonctions 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.

1
bweber

Voir Erreur LNK2019 de l'éditeur de liens sur MSDN, il contient une liste détaillée des problèmes courants provoquant LNK2019.

1

Je viens d'avoir un moment difficile avec cela. 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
}

Je me suis presque cogné la tête contre mon clavier quand j'ai oublié quelque chose d'aussi élémentaire.

1
Joe Plante

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, car c'est un peu spécifique à C++. Alors n'oubliez pas de vérifier pour cela aussi!

1
Matthew Hayes

Quelle en était la cause dans mon cas:

J'ai eu un énorme fichier Foo.cpp sans Foo.h. Foo.cpp a commencé comme ceci:

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

J'ai enlevé le mot clé "statique" et ajouté un Foo.h avec ceci:

extern int var;

Voyez-vous l'erreur?

J'ai totalement manqué que la variable var ait été définie à l'origine dans un espace de noms, car la déclaration de l'espace de noms était enterrée dans un autre code. Le correctif est de changer l'extern comme ceci:

namespace NS {
     extern int var;
}
0
Stefan Monov

Mon problème était que sconscript ne contenait pas le fichier cpp. Cela peut être très déroutant, car Visual Studio a le fichier cpp dans le projet, mais un autre élément est en cours de construction.

0
ubershmekel

Encore une autre possibilité de vérifier, c’était mon problème cette fois-ci.

J'avais ajouté la fonction à la bibliothèque et inclus le dossier de sortie de la bibliothèque dans le chemin de recherche.

Mais j'avais également un dossier avec une ancienne version de la bibliothèque répertoriée auparavant, donc VS utilisait l'ancienne bibliothèque et, bien sûr, ne trouvait pas la nouvelle fonction.

0
Francesco Dondi

Encore un autre problème possible (que je viens de me gratter la tête pendant un certain temps):

Si vous définissez vos fonctions comme inline, elles doivent bien entendu être définies dans l'en-tête (ou un inline fichier), pas un cpp .
Dans mon cas, ils se trouvaient dans un fichier en ligne, mais uniquement parce qu’il s’agissait d’une implémentation propre à la plate-forme, et un cpp incluait ce correspondant inl file… au lieu d'un en-tête. Oui, ça arrive.

Je pensais que je laisserais cela ici aussi, peut-être que quelqu'un d'autre se heurte au même problème et le trouve ici.

0
Johann Studanski

Mon problème était: je devais faire transmettre la déclaration de la classe dont le ctor était "externe non résolu".

Dans le fichier où j'ai eu l'erreur, j'ai dû mettre quelque chose comme ceci:

#include "ClassB" 

class ClassB; // this solved the problem

class ClassA{
    void foo(){
        ClassB* tmp = new ClassB();
        // ...
    }
};

Bien sûr, mon projet est beaucoup plus compliqué et il ne s'agit que d'un exemple d'extrait de code. Aussi, lorsque vous utilisez des espaces de noms, déclarez-les également .

0
vicrucann

POINTEURS

J'ai eu ce problème et résolu en utilisant un pointeur. Je vois que ce n’est pas votre problème, mais j’ai pensé que j’en parlerais, car j’aurais bien aimé que ce soit ici quand j’ai vu cela il ya 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 également élémentaire: P

0
Rabel

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'est parti que lorsque j'ai supprimé ce mot clé.

0
Beck

Je viens de passer quelques heures à découvrir que le problème était que mon fichier principal avait l'extension .c au lieu de .cpp

:/

0
Madhur