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
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:
- Ne définissez pas les fonctions de votre fichier RPC (si vous avez écrit ce code vous-même)
- 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 */ }
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?
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
- cliquez sur Propriétés du projet.
- 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.
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
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.
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.
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!
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
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.
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")
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.
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!
Voir Linker Outils d'Erreur LNK2019 sur le site MSDN, il a une liste détaillée des problèmes communs qui causent LNK2019.
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.
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
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.
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 .
vient de passer quelques heures à trouver que le problème était mon fichier principal avait une extension .c
au lieu de .cpp
:/
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)
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.
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é.
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;
}
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.