C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号
Posted
技术标签:
【中文标题】C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号【英文标题】:C++: error LNK2019: unresolved external symbol referenced in function _main 【发布时间】:2013-12-23 08:11:47 【问题描述】:我有一些关于 C++ 的代码。
鸟.h
class Bird
std::string s;
static int i;
public:
Bird();
~Bird();
friend std::ostream& operator<<(std::ostream& os, Bird& b);
;
Bird.cpp
#include <iostream>
#include <sstream>
#include "Bird.h"
Bird::Bird()
++i;
std::stringstream ss;
ss<<"Bird#";
ss<<i;
s = ss.str();
Bird::~Bird()
i--;
std::ostream& operator<<(std::ostream& os, Bird& b)
const char* chr = (b.s).c_str();
return os << chr << std::endl;
Main.cpp
#include <iostream>
#include <sstream>
#include "Bird.h"
int Bird::i=0;
int main()
Bird b();
std::cout << b;
我收到以下错误:
Main.obj : error LNK2019: unresolved external symbol "class Bird __cdecl b(void)" (?b@@YA?AVBird@@XZ) referenced in function _main
但如果我创建 Bird b;
就可以了。
我能做什么?
【问题讨论】:
向我们展示你用来编译它的命令,可能你没有向编译器发送Bird.cpp
。
【参考方案1】:
你的意思是写 Bird b;
来创建一个 Bird 对象。
Bird b()
是一个您尚未实现的函数(称为b
,不带参数并返回Bird
)。
【讨论】:
【参考方案2】:Bird b();
这意味着b
是一个不带参数并返回Bird
的函数。然后您尝试输出此函数的值,但该函数不存在。也许你想要:
Bird b;
这表示b
是一个Bird
,应该默认构造。
【讨论】:
【参考方案3】:链接器错误由此触发
Bird b();
这是一个名为b
的函数的函数声明,按值返回Bird
。然后在这里使用该函数:
std::cout << b;
并且链接器找不到它的实现。你需要
Bird b; // C++03 and C++11
Bird b; // C++11
此外,您应该考虑在Bird.cpp
中定义Bird::i
,而不是main.cpp
。
【讨论】:
【参考方案4】:试试这个:
int main()
Bird b;
std::cout << b;
默认构造函数不需要'()'
【讨论】:
它不仅需要()
,它实际上也没有使用 ()
。对于()
,它是一个函数,而不是一个对象。
那个!其实我之前理解错了。【参考方案5】:
这是一个 C++ 的“Most Vexing Parse.”的例子
C++ 编译器认为您正在声明一个名为 b
的函数,该函数返回一个 Bird
,然后尝试打印指向它的指针,而不是默认构造一个 Bird 实例。然后链接器抱怨没有名为b
的函数返回Bird
。这就是此错误消息试图告诉您的内容:
error LNK2019: unresolved external symbol "class Bird __cdecl b(void)"
最令人头疼的解析是由于 C++ 语言中的句法歧义而发生的。之所以存在歧义,是因为构造函数调用的语法看起来很像函数原型的语法。
以一种保证生成 *** 问题的方式解决了歧义,从而保持了与 C 的一些微弱的向后兼容性,但牺牲了 C++ 程序中其他显而易见的含义。
在这种情况下,因为您的 Bird
是默认构造的,您可以简单地删除括号并完成。如果您需要调用不同的构造函数,那么上面链接的 Wikipedia 文章中的建议可能会有所帮助。
如果您可以使用 C++11,则可以使用大括号初始化器语法使其始终明确:
Bird b; // Use this if default constructed
Bird b ..args.. ; // Use this if you need to invoke a particular constructor
The Most Vexing Parse 是一个非常丰富的话题。 Google it,如果你真的好奇,请阅读和阅读。
【讨论】:
【参考方案6】:如果其他方法似乎不起作用,请检查您的文件路径是否不包含特殊字符。添加额外的源文件后,这突然成为我的问题。
【讨论】:
以上是关于C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号的主要内容,如果未能解决你的问题,请参考以下文章
LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用
错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 解决方法