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 中引用

如何从 C++ 中的类文件运行函数?

错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 解决方法

混合 C 和 C++ 时继续出现 LNK2019 错误

C++ 3D 矢量模板

VS2008(C++)-控制台项目中LNK2005错误的问题