目标文件中未解析的外部符号

时间:2012-03-29 15:11:29

标签: c++ visual-studio visual-c++ unresolved-external

在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

28 个答案:

答案 0 :(得分:279)

此错误通常意味着某些函数具有声明,但不具有定义。

示例:

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

// A.cpp

// Function definition
void A::myFunc()
{
  // do stuff
}

在你的情况下,找不到定义。问题可能是你要包含一个头文件,它引入了一些函数声明,但是你要么:

  1. 不要在cpp文件中定义函数(如果你自己编写了这段代码)
  2. 不包含包含定义的lib / dll文件
  3. 一个常见的错误是您将一个函数定义为独立函数并忘记了类选择器,例如{em} .cpp 文件中的A::

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

答案 1 :(得分:23)

检查您是否包含您正在引用的解决方案中的所有源文件。

如果您未在项目中包含类Field的源文件(以及实现),则不会构建它,并且在编译期间您将无法链接。

或者,您可能正在使用静态或动态库,而忘记告诉链接器.lib s?

答案 2 :(得分:11)

它看起来缺少一个库或包含,您可以尝试找出具有getName,getType等的库的类,并将其放在头文件中或使用#include

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

  1. 单击“项目属性”。
  2. 转到配置属性,C / C ++, 生成,验证您是否指向附加下的abc.lib位置 包括目录。在链接器,输入下,确保你有 附加依赖项下的abc.lib。

答案 3 :(得分:6)

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

#ifdef __cplusplus
extern "C"
{
#endif

这些最终

#ifdef __cplusplus
}
#endif

答案 4 :(得分:4)

我的项目编译为 x64 项目时出错。我使用了编译为 x86

我已经将库重新编译为x64并且它解决了它。

答案 5 :(得分:4)

我有相同的链接错误,但来自一个引用另一个dll的测试项目。发现在错误消息中指定的每个函数前添加_declspec(dllexport)后,链接运行良好。

答案 6 :(得分:3)

我相信这个主题中的所有贡献者已经涵盖了关于原因和补救措施的大部分要点。我只想指出我未解决的外部问题。问题,它是由一个定义为宏的数据类型引起的,它被取代的方式与预期的不同,这导致错误的类型被提供给有问题的函数,并且由于函数类型从未被定义,所以它不可能解决。特别是在C / C ++下 - &gt;语言,有一个名为&#39; Treat WChar_t As Built in Type的属性,它应该被定义为&#39; No(/ Zc:wchar_t - )&#39;但在我的情况下没有。

答案 7 :(得分:3)

有时候如果添加了一个新的头文件,并且由于这个错误而开始出现此错误,您还需要添加库以摆脱unresolved external symbol

例如:

#include WtsApi32.h

需要:

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

答案 8 :(得分:2)

确保使用

装饰头文件
#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

如果你不

,可能会发生不好的事情 - 包括这个问题

答案 9 :(得分:2)

除了Chris Morris上面的优秀答案之外,我发现了一种非常有趣的方法,如果你调用的是一个尚未设置为纯粹但没有自己的实现的虚方法,你可以收到同样的错误。这是完全相同的原因(编译器找不到该方法的实现,因此无法找到骗子),但我的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人员单步执行代码!

答案 10 :(得分:1)

请参阅MSDN上的Linker Tools Error LNK2019,其中列出了导致LNK2019的常见问题。

答案 11 :(得分:1)

通过将模板类的函数定义放在单独的.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
  ...
}

我只是想分享一下,因为似乎没有其他人提到模板类。这是导致我的错误的原因。

答案 12 :(得分:1)

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

答案 13 :(得分:1)

此链接器错误的一个可能原因也可能是inline函数已声明但未在头文件中定义,然后将其包含在其他位置。内联函数必须在它们使用的每个翻译单元中定义。

答案 14 :(得分:1)

我对此很难过。一切都在逻辑上设置。我宣布了一个构造函数,但没有定义它

class SomeClass
{
   SomeClass();  // needs the SomeClass::SomeClass(){} function defined somewhere, even here
}
当我忘记了一些如此基本的东西时,我几乎把头撞在键盘上。

答案 15 :(得分:0)

我遇到了类似的问题,最终通过在类的声明中添加 __declspec(dllimport) 来解决:

// A.hpp
class __declspec(dllimport) A
{
   public: void myFunc();

   // Function declaration
};

答案 16 :(得分:0)

就我而言,我需要将函数名称添加到 DEF file

LIBRARY   DEMO
EXPORTS
   ExistingFunction   @1
   MyNewFunction      @2

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

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

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

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

答案 19 :(得分:0)

在我的案例中造成了什么:

我有一个没有Foo.h的巨大文件Foo.cppFoo.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;
}

答案 20 :(得分:0)

确保您没有尝试将插入或提取运算符重载为内联函数。我遇到了这个问题,当我删除该关键字时它才消失。

答案 21 :(得分:0)

另一个可能的问题(我只是暂时不知所措):

如果您将函数定义为inline,它们当然是! - 必须在标题(或内联文件)中定义,而不是a cpp
就我而言,它们位于内联文件中,但仅仅因为它们是特定于平台的实现,并且 cpp 包含此对应的 inl 文件...而不是标头。是的,不会发生。

我以为我也把这个留在这里,也许其他人遇到同样的问题并在这里找到它。

答案 22 :(得分:0)

另一种检查的可能性,这次是我的问题。

我已将该功能添加到库中,并在搜索路径中包含了库的输出文件夹。

但我还有一个文件夹,其中包含之前列出的旧版本库,因此VS使用的是旧库,当然也没有找到新功能。

答案 23 :(得分:0)

花了几个小时才发现问题是我的主文件有.c而不是.cpp

:/

答案 24 :(得分:0)

我的问题是:我必须对其ctor为“未解决的外部”的类进行前向声明

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

#include "ClassB" 

class ClassB; // this solved the problem

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

当然,我的项目要复杂得多,这只是一个片段示例。使用名称空间时,declare them as well

答案 25 :(得分:0)

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

答案 26 :(得分:0)

POINTERS

我遇到了这个问题并使用指针解决了这个问题。我发现这不是你的问题,但我想我会提到它,因为我确实希望它在一小时前看到这里时就已经存在了。我的问题是声明一个静态成员变量而没有定义它(在其他一些设置之后需要定义),当然指针不需要定义。同样基本的错误:P

答案 27 :(得分:-1)

我刚刚遇到了同样的错误,我设法通过在头文件中将;替换为{}来避免此错误。

#ifndef XYZ_h
#define XYZ_h
class XYZ
{
    public:
    void xyzMethod(){}
}
#endif

当它是void xyzMethod();时,它不想编译。