在Visual Studio中编码时,我得到了一个未解决的外部符号错误
我不知道该怎么办我不知道怎么了。
你能帮我破译一下吗?我应该在哪里寻找什么样的错误?
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
}
在你的情况下,找不到定义。问题可能是你包含了一个头文件,它带来了一些函数声明,但是你要么:
不要在CPP文件中定义函数(如果这段代码是您自己编写的)
不包括包含定义的lib/dll文件
一个常见的错误是你将一个函数定义为一个独立的函数,而忘记了类选择器,例如在你的.cpp文件中A::::
错误:void myFunc() {/* do stuff */}
右:void A::myFunc() {/* do stuff */}
此错误通常意味着某些函数有声明,但没有定义。
例子:
// A.hpp
class A
{
public:
void myFunc(); // Function declaration
};
// A.cpp
// Function definition
void A::myFunc()
{
// do stuff
}
在你的情况下,找不到定义。问题可能是你包含了一个头文件,它带来了一些函数声明,但是你要么:
不要在CPP文件中定义函数(如果这段代码是您自己编写的)
不包括包含定义的lib/dll文件
一个常见的错误是你将一个函数定义为一个独立的函数,而忘记了类选择器,例如在你的.cpp文件中A::::
错误:void myFunc() {/* do stuff */}
右:void A::myFunc() {/* do stuff */}
我在我的项目中遇到了同样的错误,我已经设法解决了。
这个问题把我带到了这里,但我发现这是visual studio本身的一个构建文件问题。
如果你不能在你的代码中找到任何错误,并且你做了以上所有的事情,我建议你在你的项目中寻找。vcxproj文件,检查它是否包括你的MyClass.cpp和源文件
SynthProject.vcxproj
<ItemGroup>
<ClCompile Include="main.cpp" />
<ClCompile Include="myClass.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="myClass.h" />
</ItemGroup>
SynthProject.vcxproj.filters
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="myClass.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="myClass.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
而不是像
SynthProject.vcxproj
<ItemGroup>
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="myClass.h" />
<ClInclude Include="myClass.cpp" />
</ItemGroup>
SynthProject.vcxproj.filters
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="myClass.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="myClass.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="myClass.cpp">
<Filter>Source Files</Filter>
</ClInclude>
</ItemGroup>
我已经设法手动做到这一点,但建议卸载并将文件添加回项目中,如果你没有,或不使用git。
是什么导致了我的这种情况:
我有一个很大的文件Foo.cpp,没有Foo.h。Foo.cpp的开头是这样的:
// ... 100 LOC here ...
namespace NS {
// ... 100 more LOC here ...
static int var;
我删除了“static”关键字,并添加了一个Foo.h:
extern int var;
你看到错误了吗?
我完全忽略了var最初是在名称空间中定义的,因为名称空间声明隐藏在其他代码中。修复是这样改变extern:
namespace NS {
extern int var;
}