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

Nov*_*tor 170 c++ unresolved-external visual-studio visual-c++

在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
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 289

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

例:

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

// A.cpp

// Function definition
void A::myFunc()
{
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

错了: void myFunc() { /* do stuff */ }
对: void A::myFunc() { /* do stuff */ }

  • 如何在我的项目中包含上述 lib 文件? (2认同)
  • 最后的建议正是这里的问题.我正在做`void myFunc(){}`而不是`A :: void myFunc(){}`. (2认同)

Kon*_*rad 24

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

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

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

  • 引用正确的lib文件可以解决此问题。使用项目-&gt;属性-&gt;链接器-&gt;常规-&gt;附加库目录和项目-&gt;属性-&gt;链接器-&gt;输入-&gt;其他依赖关系来引用lib目录和lib文件 (2认同)

Fyl*_*lix 11

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

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

  1. 单击"项目属性".
  2. 转到配置属性,C/C++,生成,验证您是否指向其他包含目录下的abc.lib位置.在Linker,Input下,确保在Additional Dependencies下有abc.lib.


小智 7

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

#ifdef __cplusplus
extern "C"
{
#endif
Run Code Online (Sandbox Code Playgroud)

最后这些

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)


Gal*_*cha 7

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

我将库重新编译为x64,并解决了该问题。


meJ*_*rew 6

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


小智 6

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

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

template<typename T>
MyClassName {
  void someFunction() {
    // Do something
    ...
  }
  void anotherFunction() {
    // Do something else
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以在类定义之后但在同一个文件中定义它们,如下所示:

template<typename T>
MyClassName {
  void someFunction();
  void anotherFunction();
}

void MyClassName::someFunction() {
  // Do something
  ...
}
void MyClassName::anotherFunction() {
  // Do something else
  ...
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

例如:

#include WtsApi32.h
Run Code Online (Sandbox Code Playgroud)

将需要:

#pragma comment(lib, "Wtsapi32.lib") 
Run Code Online (Sandbox Code Playgroud)


Joh*_*ski 5

还有另一个可能的问题(我只是挠头了一段时间):

\n\n

如果您将函数定义为,那么它们 \xe2\x80\x94 当然!\xe2\x80\x94 必须在标头(或内联文件)inline中定义,而不是cpp。\n就我而言,它们位于内联文件中,但这只是因为它们是特定于平台的实现,并且 cpp包含此相应的inl
文件\xe2\x80\xa6 而不是标头。是的,事情发生了。

\n\n

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

\n