Symbole externe non résolu dans les fichiers objets

pendant le codage dans Visual Studio j'ai eu une erreur de symbole externe non résolue et j'ai aucune idée de quoi faire. Je ne sais pas quel est le problème. Pourriez-vous s'il vous plaît déchiffrer moi? Où dois-je chercher quel genre 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:UserstomyDocumentsVisual Studio 2010Projectszapoctovkac++Debugzapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals
152
demandé sur moffeltje 2012-03-29 19:11:28

23 réponses

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 n'est pas disponible. le problème pourrait être que vous incluez un fichier d'en-tête, qui apporte quelques déclarations de fonction, mais vous soit:

  1. Ne définissez pas les fonctions de votre fichier RPC (si vous avez écrit ce code vous-même)
  2. n'inclut pas le fichier lib/dll qui contient les définitions

une erreur courante est de définir une fonction comme une fonction autonome et d'oublier le sélecteur de classe, par exemple A:: , dans votre .rpc fichier:

Mauvais: void myFunc() { /* do stuff */ }

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

271
répondu Chris Morris 2015-03-12 23:44:36

vérifiez que vous incluez tous les fichiers sources dans votre solution que vous référencez.

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

alternativement, peut-être utilisez-vous une bibliothèque statique ou dynamique et avez-vous oublié de parler au linker du .lib s?

22
répondu Konrad 2012-03-29 15:40:21

il semble manquer une bibliothèque ou include, vous pouvez essayer de comprendre quelle classe de votre bibliothèque qui ont getName, getType, etc... et mettez ça dans le fichier d'en-tête ou en utilisant #include .

aussi, s'il s'agit d'une bibliothèque externe, assurez-vous d'y faire référence dans votre dossier de projet. Par exemple, si cette catégorie appartient à un groupe abc.lib puis dans votre studio visuel

  1. cliquez sur Propriétés du projet.
  2. aller aux propriétés de Configuration, C / C++, Générez, vérifiez que vous pointez vers l'abc.lib emplacement Supplémentaire Inclure Des Répertoires. Sous Linker, Input, assurez-vous que vous avez le ABC.lib sous dépendances supplémentaires.
11
répondu Fylix 2017-06-12 23:08:34

je viens de voir le problème que je ne peux pas appeler une fonction de main in .fichier cpp, correctement déclarée .h fichier et défini .c fichier. A rencontré une erreur de l'éditeur de liens. En attendant je peux appeler la fonction d'habitude .c fichier. Cela dépend peut-être de la Convention d'appel. La Solution était d'ajouter les lignes préproc suivantes dans chaque .h fichier:

#ifdef __cplusplus
extern "C"
{
#endif

et ceux-ci à la fin

#ifdef __cplusplus
}
#endif
6
répondu Alexey257 2015-09-14 13:40:28

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

j'ai recompilé la bibliothèque en x64 et elle l'a résolue.

4
répondu Gal Bracha 2017-02-06 13:55:20

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

3
répondu meJustAndrew 2016-10-08 12:41:45

en plus de L'excellente réponse de Chris Morris ci-dessus, j'ai trouvé une façon très intéressante vous pouvez recevoir ce même défaut si vous appelez à une méthode virtuelle qui n'a pas été fixée à pure mais ne fait pas sa propre mise en œuvre. 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é ce défaut dans le moindre détail.

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 () en une méthode purement virtuelle (une méthode qui "doit" être implémentée, qui par rapport à une méthode virtuelle qui est une méthode que "peut" être dépassée) éliminera l'erreur de compilation.

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

espère que cela aidera le prochain StackOverFlow qui franchira le code!

2
répondu GMLewisII 2015-05-11 13:26:04

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 se produire si vous ne le faites pas

2
répondu Panouden 2015-06-24 23:00:45

je crois 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 mon problème "externe non résolu", il a été causé par un type de données défini comme macro qui est substitué différemment que prévu, ce qui entraîne ce type incorrect étant fourni à la fonction en question, et puisque la fonction avec type n'est jamais défini, il ne pouvait pas avoir été résolu. En particulier, sous C / C++ -> Langue, 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.

2
répondu Patrick Nguyen 2015-11-17 23:24:09

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

par exemple:

#include WtsApi32.h

aurez besoin de:

#pragma comment(lib, "Wtsapi32.lib") 
2
répondu Shashank 2016-06-21 14:26:31

j'ai eu du mal avec ça. Tout était organisé logiquement. 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 presque cogné la tête sur mon clavier quand j'ai oublié quelque chose d'aussi élémentaire.

1
répondu Joe Plante 2015-01-18 06:25:59

je fais du C++ pour la première fois depuis longtemps, et j'obtiens cette erreur quand j'oublie d'ajouter le préfixe ClassName:: pour la définition de la fonction, puisque c'est un peu unique en C++. Alors, n'oubliez pas de vérifier également!

1
répondu Matthew Hayes 2015-02-23 21:13:54

Voir Linker Outils d'Erreur LNK2019 sur le site MSDN, il a une liste détaillée des problèmes communs qui causent LNK2019.

1
répondu Alessandro Jacopson 2015-06-12 12:46:42

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

1
répondu bweber 2017-01-26 13:22:37

pointeurs

j'ai eu ce problème et l'ai résolu en utilisant pointer. Je vois que ce n'était pas votre problème, mais j'ai pensé le mentionner parce que j'aurais aimé qu'il soit là quand j'ai vu ça 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

0
répondu Rabel 2015-05-07 09:09:48

mon numéro était un sconscript n'avait pas le fichier cpp défini dans celui-ci. Cela peut être très déroutant car Visual Studio a le fichier cpp dans le projet mais quelque chose d'autre est en construction.

0
répondu ubershmekel 2016-01-21 00:03:33

mon problème était: je devais faire forward declaration de la classe dont le ctor était"externe non résolu".

Dans le fichier où j'ai obtenu 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 ce n'est qu'un exemple. Aussi en utilisant des espaces de noms, les déclarent aussi .

0
répondu vicrucann 2017-05-23 12:18:29

vient de passer quelques heures à trouver que le problème était mon fichier principal avait une extension .c au lieu de .cpp

:/

0
répondu Madhur 2016-07-15 23:49:13

vérifiez que votre plateforme cible VS project est compatible avec les binaires que vous avez téléchargés.

par exemple: Plate-forme: Win32 - - - - VS2013 32bits 6.3(statique)

0
répondu isunchy 2016-10-28 08:30:50

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

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 aussi un dossier avec une ancienne version de la bibliothèque listée avant, donc VS utilisait l'ancienne bibliothèque, et bien sûr ne pas trouver la nouvelle fonction.

0
répondu Francesco Dondi 2017-03-13 08:27:07

assurez-vous que vous n'essayez pas de surcharger les opérateurs d'insertion ou d'extraction comme les fonctions en ligne. J'ai eu ce problème et il est seulement parti quand j'ai enlevé ce mot clé.

0
répondu Beck 2017-11-17 04:00:37

Ce qui avait causé dans mon cas:

j'avais un énorme dossier Foo.cpp sans Foo.H. Foo.cpp commence ainsi:

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

j'ai supprimé le mot-clé "statique" et ajouté un Foo.h avec ceci:

extern int var;

voyez-vous l'erreur?

j'ai totalement manqué que var ait été défini à l'origine dans un namespace, parce que la déclaration namespace était enfouie dans un autre code. La solution est d' changez l'extern comme ceci:

namespace NS {
     extern int var;
}
0
répondu Stefan Monov 2018-03-02 14:54:19

encore un autre problème possible (que je me suis gratté la tête pendant un certain temps):

si vous définissez vos fonctions comme inline , ils-bien sûr!-doivent être définis dans le en-tête (ou un inline Fichier), pas un cpp .

Dans mon cas, ils étaient dans un fichier en ligne, mais seulement parce qu'ils étaient une implémentation spécifique à la plate-forme, et un cpp inclus ce fichier INL correspondant... au lieu d'un en-tête. Ouais, s**t qui se passe.

j'ai pensé que je laisserais ça ici, aussi, peut-être que quelqu'un d'autre se retrouve dans le même problème et le trouve ici.

-1
répondu Johann Studanski 2017-10-16 22:30:44