211

在 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
4

29 回答 29

328

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

例子:

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

// A.cpp

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

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

  1. 不要在你的 cpp 文件中定义函数(如果你自己写了这段代码)
  2. 不包括包含定义的 lib/dll 文件

一个常见的错误是您将一个函数定义为独立的并且忘记了类选择器,例如A::,在您的.cpp文件中:

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

于 2012-03-29T15:29:14.200 回答
29

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

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

或者,也许您正在使用静态或动态库并且忘记告诉链接器关于.libs?

于 2012-03-29T15:15:17.577 回答
13

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

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

  1. 单击项目属性。
  2. 转到配置属性、C/C++、生成,验证您指向附加包含目录下的 abc.lib 位置。在 Linker 下的 Input 下,确保在 Additional Dependencies 下有 abc.lib。
于 2012-03-29T15:20:22.327 回答
10

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

#ifdef __cplusplus
extern "C"
{
#endif

而这些到底

#ifdef __cplusplus
}
#endif
于 2015-09-14T13:40:28.473 回答
9

我的项目被编译为x64项目时出现错误。我使用了一个编译为x86的

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

于 2017-02-06T13:55:20.167 回答
6

有时如果添加了新的头文件,并且因此开始出现此错误,您还需要添加库以摆脱unresolved external symbol.

例如:

#include WtsApi32.h

将需要:

#pragma comment(lib, "Wtsapi32.lib") 
于 2016-06-21T13:05:50.827 回答
6

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

于 2016-10-08T12:41:45.433 回答
4

另一个可能的问题(我只是摸索了一段时间):

如果将函数定义为inline,它们——当然!——必须在头文件(或内联文件)中定义,而不是cpp
在我的例子中,它们在一个内联文件中,但这仅仅是因为它们是一个特定于平台的实现,并且一个cpp包含这个对应的inl文件......而不是一个头文件。是的,事情发生了。

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

于 2017-10-16T22:30:44.710 回答
3

除了上面 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 人员逐步完成代码!

于 2015-05-11T13:26:04.397 回答
3

我相信关于原因和补救措施的大部分要点都已被该线程中的所有贡献者所涵盖。我只想指出我的“未解决的外部”问题,它是由定义为宏的数据类型引起的,该数据类型的替换方式与预期不同,这导致向相关函数提供了不正确的类型,并且由于函数类型从未定义,它无法解决。特别是,在 C/C++ -> Language 下,有一个名为“Treat WChar_t As Built in Type”的属性,它应该被定义为“No (/Zc:wchar_t-)”,但在我的例子中没有。

于 2015-11-17T23:24:09.770 回答
2

我只是很难受。一切都顺理成章。我声明了一个构造函数但没有定义它

class SomeClass
{
   SomeClass();  // needs the SomeClass::SomeClass(){} function defined somewhere, even here
}

当我忘记了一些如此基本的东西时,我差点把头撞在键盘上。

于 2015-01-18T06:25:59.647 回答
2

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

于 2015-06-12T12:46:42.230 回答
2

确保你用

#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

如果你不这样做,坏事 - 包括这个 - 可能会发生

于 2015-06-24T23:00:45.937 回答
2

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

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

于 2020-08-03T20:25:13.490 回答
1

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

于 2015-02-23T21:13:54.347 回答
1

指针

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

于 2015-05-07T09:09:48.707 回答
1

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

于 2017-01-26T13:22:37.277 回答
0

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

于 2016-01-21T00:03:33.303 回答
0

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

在我收到错误的文件中,我必须输入如下内容:

#include "ClassB" 

class ClassB; // this solved the problem

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

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

于 2016-05-27T16:24:12.543 回答
0

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

:/

于 2016-07-15T23:49:13.670 回答
0

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

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

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

于 2017-03-13T08:27:07.390 回答
0

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

于 2017-11-17T04:00:37.287 回答
0

是什么导致了我的情况:

我有一个Foo.cpp没有 Foo.h的大文件。Foo.cpp开始是这样的:

// ... 100 LOC here ...
namespace NS {
// ... 100 more LOC here ...
static int var;

我删除了“静态”关键字并添加了一个Foo.h

extern int var;

你看到错误了吗?

我完全错过了 var 最初是在命名空间中定义的,因为命名空间声明隐藏在其他代码中。解决方法是像这样更改外部:

namespace NS {
     extern int var;
}
于 2018-03-02T14:54:19.570 回答
0

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

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

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

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

于 2020-03-08T17:27:37.613 回答
0

在仔细查看链接器错误之前的行之前,我来到这里寻找可能的解释。结果证明这是一个缺少全局声明的附加可执行文件!

于 2020-05-22T14:52:28.017 回答
0

就我而言,我需要将函数名称添加到DEF 文件中。

LIBRARY   DEMO
EXPORTS
   ExistingFunction   @1
   MyNewFunction      @2
于 2021-01-18T15:01:36.037 回答
0

我遇到了类似的问题,最后设法通过添加__declspec(dllimport)类的声明来解决它:

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

   // Function declaration
};
于 2021-01-31T12:04:48.457 回答
0

在我的情况下,我的头文件中有多个命名空间而没有嵌套(一个接一个),但是在我的源文件中,我不小心将其中一个命名空间嵌套在另一个命名空间中:

// myExample.h

#ifndef MYEXAMPLE_H
#define MYEXAMPLE_H

namespace A
{
  void aFunc();
}

namespace B
{
  void bFunc();
}
// myExample.cpp

#include "myExample.h"

namespace A
{
  void aFunc()
  {
    ...
  }

  namespace B   // whoops! I nested this inside namespace A when I didn't mean to.
  {
    void bFunc()
    {
      ...
    }
  }
}
// main.cpp

#include "myExample.h"

int main()
{
  myExample::B::bFunc();
  
  return 0;
}

当我使用 F12 在 Main 中的函数上“转到定义”时,Visual Studio 在源文件中找到了代码,即使它是偶然在更深的命名空间中声明的。

调试技术

我在尝试调试问题时重命名函数时发现了问题。重命名预览窗口显示了一个“外部引用”节点,其中源文件内的函数显然意外地嵌套在另一个命名空间下。

于 2022-01-22T00:01:18.540 回答
-1

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

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

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

于 2020-06-13T20:39:39.063 回答