在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

当前回答

导致“未解析的外部符号”错误的一个可能原因是函数调用约定。

确保所有源文件都使用相同的标准(.c或.cpp),或者指定调用约定。

否则,如果一个文件是C文件(source.c),另一个文件是.cpp文件,并且它们链接到相同的头文件,那么将抛出“未解析的外部符号”错误,因为该函数首先被定义为C cdecl函数,但随后使用相同头文件的c++文件将寻找c++函数。

为了避免“未解析的外部符号错误”,请确保函数调用约定在使用它的文件中保持相同。

其他回答

我有同样的链接错误,但从一个测试项目引用另一个dll。发现在错误消息中指定的每个函数前面添加_declspec(dllexport)后,链接正常工作。

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

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

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

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

我的问题是:我必须对一个“外部未解决”的课程做前向声明。

在我得到错误的文件中,我必须放这样的东西:

#include "ClassB" 

class ClassB; // this solved the problem

class ClassA{
    void foo(){
        ClassB* tmp = new ClassB();
        // ...
    }
};

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