编译时报错“LNK2019 无法解析的外部符号”的可能原因及其解决办法

在VS2022中运行C++程序的时候,有时候会遇到这样的问题:

1>(源文件名称).obj : error LNK2019: 无法解析的外部符号 "public: __cdecl (函数名(参数列表))" (??0(函数名与乱码)@@QEAA@XZ),函数 main 中引用了该符号 1>项目路径\x64\Debug\可执行程序名.exe : fatal error LNK1120: 1 个无法解析的外部命令

遇到这种问题,可以说是很难看出来到底是哪里出的问题,而且在解析代码的时候也不会有任何的标红。

根据我敲代码的经验,可能的原因(不断补充更新中):

目录

1.没有写主函数main

2.类在定义的时候,类的构造函数和析构函数没有实现

3.函数在调用的时候,没有与参数列表完全对应

4. 函数在头文件中的声明与在源文件中的定义(即实现)不一致

​编辑

5. ……


1.没有写主函数main

(初学C语言的时候发现的)

有可能是,你把main错写成了mian,

或者后来的时候,当你兴高采烈地实现了所有功能函数,以为大功告成的时候,激动地按下Fn F5开始调试(不运行),结果被一个冷冰冰的报错弹了回来。忘记写主函数啦!

2.类在定义的时候,类的构造函数和析构函数没有实现

(初学C++中的类的时候发现的)

即使是用{}空实现也可以,但是一定要给出一个实现!

例如:

class Rect
{
private:
    int m_X;
    int m_Y;
public:
    //Rect();//这样可能就会出现这种LNK2019的报错
    Rect(){};//必须给个实现,哪怕是空实现“{}”也可以
    //……//其他成员函数
}

3.函数在调用的时候,没有与参数列表完全对应

(做数据结构的“用栈实现表达式求值”的时候发现的)

尤其是涉及到指针的时候甚至有时不会在代码解析阶段给你标红。

例如:

一个函数的定义是这样的:

Status In(char* c, char str[])
{
    //……
}

那在调用它的时候就要注意了:

char OPSET[7] = { '+','-','*','/','(',')','#' };
//……其它代码
ElemType* c = new ElemType[256];
//……其它代码
//In(c, OPSET);//错误,可能解析代码的时候没有标红,但在代码编译的时候出现LNK 2019的那个报错
In(c, OPSET);//正确

4. 函数在头文件中的声明与在源文件中的定义(即实现)不一致

(做数据结构实习的时候发现的)

有的时候,当你修改了在源文件里面的函数的参数列表,又忘了把头文件里面的函数声明改过来的时候,就会出现这种链接错误。

发现错误的提示之一:在头文件里面的那个函数声明那里会出现警告:“未找到"(函数名)"的函数定义(就像下图这样的)”。因为你在源文件中的函数的参数列表跟它不一样,编译器会认为这是两个函数。

5. ……

如果还有其他可能的情况,欢迎在评论区补充哦!我会及时加进去的!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值