在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

当前回答

I believe most of the points regarding the causes and remedies have been covered by all contributors in this thread. I just want to point out for my 'unresolved external' problem, it was caused by a datatype defined as macro that gets substituted differently than expected, which results in that incorrect type being supplied to the function in question, and since the function with type is never defined, it couldn't have been resolved. In particular, under C/C++ -> Language, there is an attribute called 'Treat WChar_t As Built in Type, which should have been defined as 'No (/Zc:wchar_t-)' but did not in my case.

其他回答

是什么导致了我的这种情况:

我有一个很大的文件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;
}

此错误可能是由于将模板类的函数定义放在单独的.cpp文件中引起的。对于模板类,成员函数必须在头文件中声明。可以通过在.h文件中定义成员函数内联或紧跟类定义之后来解决这个问题。

例如,不像其他类那样将函数定义放在.cpp文件中,你可以像这样内联定义它们:

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
  ...
}

我只是想分享一下,因为似乎没有人提到模板类。这就是我的案例中出现错误的原因。

除了上面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的人逐步通过代码!

我在我的项目中遇到了同样的错误,我已经设法解决了。

这个问题把我带到了这里,但我发现这是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。

我来这里寻找一个可能的解释,然后再仔细看看链接器错误之前的行。原来它是一个缺少全局声明的附加可执行文件!