目标文件中未parsing的外部符号

在Visual Studio编码过程中,我得到了一个无法parsing的外部符号错误,我不知道该怎么做。 我不知道什么是错的。 你能解释我吗? 我应该在哪里寻找什么样的错误?

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 

这个错误通常意味着一些函数有一个声明,但不是一个定义。

例:

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

在你的情况下,定义无法find。 问题可能是你正在包含一个头文件,它引入了一些函数声明,但你可以:

  1. 不要在你的cpp文件中定义函数(如果你自己写这个代码的话)
  2. 不要包含包含定义的lib / dll文件

一个常见的错误是,你将一个函数定义为一个独立的函数,并且在你的.cpp文件中忘记了A::类select器:

错误: void myFunc() { /* do stuff */ }
正确: void A::myFunc() { /* do stuff */ }

检查您是否包含您引用的解决scheme中的所有源文件。

如果您的项目中没有包含类Field的源文件(以及实现),则不会生成,编译期间将无法链接。

另外,也许你正在使用静态或dynamic库,并忘记告诉链接器有关.lib s?

它看起来是缺less一个库或包括,你可以尝试找出你的类的getName,getType等类,并把它放在头文件或使用#include

此外,如果这些恰好来自外部库,请确保在项目文件中引用它们。 例如,如果这个类属于你的Visual Studio中的abc.lib

  1. 点击Project Properties。
  2. 转到configuration属性,C / C ++,生成,validation您是否指向附加包含目录下的abc.lib位置。 在“链接器”下的“input”下,确保在“其他依赖项”下有abc.lib。

我刚刚看到问题,我不能从.cpp文件中的main调用函数,在.h文件中正确声明并在.c文件中定义。 遇到链接器错误。 同时我可以从通常的.c文件中调用函数。 可能它取决于通话惯例。 解决方法是在每个.h文件中添加以下预处理行:

 #ifdef __cplusplus extern "C" { #endif 

而这些到底

 #ifdef __cplusplus } #endif 

我有一个错误,我的项目被编译为x64项目。 我已经使用了一个编译为x86

我已经重新编译为x64的库,它解决了它。

除了上面Chris Morris的优秀回答之外,我发现了一个非常有趣的方法,如果你正在调用一个虚拟的方法,但是没有被设置为纯粹的,而是没有自己的实现,那么你可能会收到同样的错误。 这是完全一样的原因(编译器无法find该方法的实现,因此骗子),但我的IDE并没有发现这个错误。

例如,下面的代码将得到一个编译错误与相同的错误消息:

 //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; } } 

但是,将IamInterface myFunc()更改为纯虚拟方法(“必须”实现的方法,而不是作为“可以”被覆盖的方法的虚方法)将消除编译错误。

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

希望这有助于下一个StackOverFlow人通过代码!

我相信大多数关于原因和补救措施的观点已经被所有的贡献者所覆盖。 我只想指出我的“未解决的外部”问题,它是由定义为macros的数据types导致的,这个数据types的取代与预期的不同,导致错误的types被提供给有问题的函数,从来没有定义,它不能被解决。 特别是在C / C ++ – > Language下,有一个名为'Treat WChar_t As Built in Type'的属性,应该被定义为'No(/ Zc:wchar_t-)',但是在我的情况下没有。

有时如果添加了一个新的头文件,并且由于这个错误开始,你需要添加库以及摆脱无法unresolved external symbol

例如:

 #include WtsApi32.h 

将需要:

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

我有相同的链接错误,但从一个正在引用另一个DLL的testing项目。 发现在错误消息中指定的每个函数前面添加_declspec(dllexport)之后,链接运行良好。

我在很长一段时间里第一次做了一些C ++,当我忘记为函数定义添加ClassName ::前缀时,我得到这个错误,因为这对于C ++来说是一个独特的东西。 所以记得检查一下!

请参阅MSDN中的链接器工具错误LNK2019 ,它有导致LNK2019的常见问题的详细列表。

确保你装饰你的头文件

 #ifndef YOUR_HEADER_H #define YOUR_HEADER_H // your header code here #endif 

如果你不这样做,可能会发生坏事 – 包括这一点

此链接器错误的一个可能的原因也可以是inline函数声明,但没有在头文件中定义,然后包含在其他地方。 内联函数必须在每个使用的翻译单元中定义。

我只是很难与此。 一切都在逻辑上build立起来了。 我声明了一个构造函数,但没有定义它

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

当我忘记了那么简单的东西的时候,我几乎在我的键盘上敲了敲头。

POINTERS

我有这个问题,并通过使用指针来解决它。 我看到这不是你的问题,但我想我会提到它,因为我一定希望在一个小时前看到这件事的时候,它已经在这里。 我的问题是关于声明一个静态成员variables没有定义它(定义需要来一些其他设置之后),当然一个指针不需要定义。 同样基本的错误:P

我的问题是一个sconscript没有在其中定义的cpp文件。 这可能是非常令人困惑,因为Visual Studio有项目中的cpp文件,但其他东西完全正在build设。

我的问题是:我不得不做前期申报 ,因为这个课程“外部没有解决”。

在我得到错误的文件中,我不得不这样做:

 #include "ClassB" class ClassB; // this solved the problem class ClassA{ void foo(){ ClassB* tmp = new ClassB(); // ... } }; 

当然,我的项目要复杂得多,这只是一个例子。 当使用名称空间时,也要声明它们 。

刚花了几个小时才发现问题是我的主文件扩展名为.c而不是.cpp

:/

检查你的VS项目目标平台是否与你下载的二进制文件一致。

比如:平台: Win32 —- VS2013 32位 6.3(静态)

还有另外一个可能性,这次是我的问题。

我已经将函数添加到库中,并在searchpath中包含了库的输出文件夹。

但是我也有一个旧版本库的文件夹,所以VS使用旧的库,当然没有find新的function。

确保不要试图将插入或提取操作符重载为内联函数。 我有这个问题,只有当我删除该关键字时,它才消失。

还有一个可能的问题(我只是挠了一下头):

如果将函数定义为inline函数,那么它们(当然)必须在头文件 (或内联文件)中定义,而不是cpp
在我的情况下,他们在一个内联文件,但只是因为他们是一个特定于平台的实现,并且一个cpp包含这个相应的inl文件…而不是一个头。 是的,不会发生。

我想我也会在这里,也许有人遇到同样的问题,并在这里find它。