在VS2022中运行C++程序的时候,有时候会遇到这样的问题:
1>(源文件名称).obj : error LNK2019: 无法解析的外部符号 "public: __cdecl (函数名(参数列表))" (??0(函数名与乱码)@@QEAA@XZ),函数 main 中引用了该符号 1>项目路径\x64\Debug\可执行程序名.exe : fatal error LNK1120: 1 个无法解析的外部命令
遇到这种问题,可以说是很难看出来到底是哪里出的问题,而且在解析代码的时候也不会有任何的标红。
根据我敲代码的经验,可能的原因(不断补充更新中):
目录
4. 函数在头文件中的声明与在源文件中的定义(即实现)不一致
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. ……
如果还有其他可能的情况,欢迎在评论区补充哦!我会及时加进去的!