C++ 对象文件中未解析的外部符号
在VisualStudio中编码期间,我遇到了一个未解决的外部符号错误 我不知道该怎么办。我不知道怎么了。 你能给我解释一下吗?我应该在哪里查找哪种错误C++ 对象文件中未解析的外部符号,c++,visual-studio,visual-c++,unresolved-external,C++,Visual Studio,Visual C++,Unresolved External,在VisualStudio中编码期间,我遇到了一个未解决的外部符号错误 我不知道该怎么办。我不知道怎么了。 你能给我解释一下吗?我应该在哪里查找哪种错误 1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" (?addField@Field@@QAEPAV1@PAV1@@Z) referenced in
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
1>Form.obj:错误LNK2019:未解析的外部符号“public:class-Field*\uu thiscall-Field::addField(class-Field*)”(?addField@Field@@QAEPAV1@PAV1@@Z) 函数“public:void u thiscall Form::parse(类std::basic_stringstream&)”中引用(?parse@Form@@Qaexav?$basic_stringstream@DU?$char_traits@D@性病病毒$allocator@D@2@@@std@@@Z)
1> Form.obj:错误LNK2019:未解析的外部符号“public:virtual void\u thiscall Field::parse(class std::basic\u stringstream&)”(?parse@Field@@UAEXAAV?$basic_stringstream@DU?$char_traits@D@性病病毒$allocator@D@函数“public:\u thiscall InputField::InputField(类std::basic\u stringstream&)”中引用了2@@std@@@Z)(??0输入字段)@@QAE@AAV?$basic_stringstream@DU?$char_traits@D@性病病毒$allocator@D@2@@@std@@@Z)
1> Form.obj:错误LNK2001:未解析的外部符号“public:virtual void u thiscall Field::prompt(void)”(?prompt@Field@@UAEXXZ)
1> Form.obj:错误LNK2001:未解析的外部符号“public:virtual class std::basic_string uu thiscall Field::getName(void)”(?)?getName@Field@@阿联酋?AV?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@XZ)
1> Form.obj:错误LNK2001:未解析的外部符号“public:virtual class std::basic_string\u thiscall Field::getType(void)”(?getType@Field@@阿联酋?AV?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@XZ)
1> Form.obj:错误LNK2001:未解析的外部符号“public:virtual void u thiscall Field::description(void)”(?describe@Field@@UAEXXZ)
1> C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe:致命错误LNK1120:6个未解析的外部
检查您是否将引用的所有源文件包括在您的解决方案中
如果您没有在项目中包含类字段
的源文件(以及实现),则不会生成它,并且在编译过程中无法链接
或者,您可能正在使用静态或动态库,但忘记了告诉链接器
.lib
s?它似乎缺少库或包含,您可以尝试找出库中具有getName、getType等的类,并将其放在头文件中或使用\include
此外,如果这些类恰好来自外部库,请确保在项目文件中引用它们
此错误通常意味着某些函数有声明,但没有定义 例如:
// A.hpp
class A
{
public:
void myFunc(); // Function declaration
};
// A.cpp
// Function definition
void A::myFunc()
{
// do stuff
}
在您的情况下,无法找到定义。问题可能是您包含了一个头文件,其中包含了一些函数声明,但您:
A::
:
错误:void myFunc(){/*do stuff*/}
对:
void A::myFunc(){/*do stuff*/}
我只是很难做到这一点。一切都是按逻辑设置的。我声明了一个构造函数,但没有定义它
class SomeClass
{
SomeClass(); // needs the SomeClass::SomeClass(){} function defined somewhere, even here
}
当我忘记了一些基本的东西时,我几乎把脑袋撞到键盘上。 < P>我在很久以前第一次做了一些C++,当我忘记添加CordNe::函数定义的前缀时,我就得到了这个错误,因为这是C++的一个独特之处。所以请记住也要检查它!
指针< /P>
我遇到了这个问题,并用指针解决了它。我知道这不是你的问题,但我想我应该提到它,因为我真希望在一小时前看到它时它就在这里。我的问题是关于声明一个静态成员变量而不定义它(定义需要在其他设置之后进行)当然,指针不需要定义。同样基本的错误:P
除了上面Chris Morris的优秀答案之外,我还发现了一种非常有趣的方法,如果您调用的虚拟方法没有设置为pure,但没有自己的实现,那么您可能会收到同样的错误。原因完全相同(编译器找不到该方法的实现,因此出错),但我的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人员逐步了解代码!请参阅MSDN,它列出了导致LNK2019的常见问题的详细列表。请确保使用
#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H
// your header code here
#endif
如果您不我刚刚看到一个问题,我无法从.cpp文件中的main调用函数,在.h文件中正确声明,在.c文件中定义。遇到链接器错误。同时,我可以从普通的.c文件调用函数。可能这取决于调用约定。解决方案是添加以下预处理lin每个.h文件中的es:
#ifdef __cplusplus
extern "C"
{
#endif
最后呢?
#ifdef __cplusplus
}
#endif
我相信关于原因和补救措施的大部分观点都已包含在所有内容中
#include "ClassB"
class ClassB; // this solved the problem
class ClassA{
void foo(){
ClassB* tmp = new ClassB();
// ...
}
};
#include WtsApi32.h
#pragma comment(lib, "Wtsapi32.lib")
// ... 100 LOC here ...
namespace NS {
// ... 100 more LOC here ...
static int var;
extern int var;
namespace NS {
extern int var;
}
#ifndef XYZ_h
#define XYZ_h
class XYZ
{
public:
void xyzMethod(){}
}
#endif
template<typename T>
MyClassName {
void someFunction() {
// Do something
...
}
void anotherFunction() {
// Do something else
...
}
}
template<typename T>
MyClassName {
void someFunction();
void anotherFunction();
}
void MyClassName::someFunction() {
// Do something
...
}
void MyClassName::anotherFunction() {
// Do something else
...
}
LIBRARY DEMO
EXPORTS
ExistingFunction @1
MyNewFunction @2
// A.hpp
class __declspec(dllimport) A
{
public: void myFunc();
// Function declaration
};