在VS2022中运行C++程序的时候,有时候会遇到这样的问题:
1>(源文件名称).obj : error LNK2005: "(函数的返回值类型) __cdecl (函数名(参数列表))" (?(函数名与乱码)@@YA_NPEAUlinknode@@@Z) 已经在(解决方案名称).obj 中定义
1>(可执行程序的路径与名称).exe : fatal error LNK1169: 找到一个或多个多重定义的符号
遇到这种问题,可以说是很难看出来到底是哪里出的问题,而且在解析代码的时候也不会有任何的标红。
根据我敲代码的经验,可能的原因(不断补充更新中):
1.在源文件中,在最开始,#include "…… .cpp"了
正确的应该是:#include "... .h"才对
P.S. 提示:
(以下代码来源于我的数据结构实习中“栈”的代码)
(1)头文件里面应该写这些东西:
//以下代码来源于我在数据结构中做的栈的实习
//预编译指令
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once/*防止头文件重复包含*/
//头文件
#include<iostream>
#include<cstdlib>
#include <ctime>//用于产生随机数
#include<cmath>
#include<string>
#include<string.h>
//预定义常量和变量类型,注意有无分号
#define OK 1
#define ERROR 0
//#define OVERFLOW -2//宏重定义
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 100
typedef char ElemType;
typedef double DataElemType;
typedef int Status;
//使用的命名空间
using namespace std;
//定义的结构、联合、类等
typedef struct tag_SqStack
{
ElemType* base;// 存储空间基址
ElemType* top;// 栈顶指针
int stacksize;// 当前可使用的最大存储空间,以元素为单位
}SqStack;
typedef struct Datatag_SqStack
{
DataElemType* base;// 存储空间基址
DataElemType* top;// 栈顶指针
int stacksize;// 当前可使用的最大存储空间,以元素为单位
}DataSqStack;
//全局变量,注意【只声明,不要实现】;甚至可以根本不用在头文件里声明(如果头文件中用不到的话)
unsigned char Prior[7][7];
char OPSET[7];
不要把变量的定义放入.h文件,这样容易导致重复定义错误(报错:error:LNK2005 已经在*.obj中定义;)
在头文件中,可以只声明变量
*/
//功能函数,注意【只声明,不要实现】
void ShowMenu();
void ExitSystem();
Status InitStack(SqStack& S);
Status InitStack(DataSqStack& S);
Status Push(SqStack& S, ElemType e);
Status Push_Data(DataSqStack& S, DataElemType e);
ElemType Pop(SqStack& S);
Status Pop(DataSqStack& S, DataElemType& e);
Status ClearStack(SqStack& S);
Status ClearStack(DataSqStack& S);
Status DestroyStack(SqStack& S);
Status DestroyStack(DataSqStack& S);
Status In(char c, char str[]);
Status Precede(char a, char b);
DataElemType OperateCal(DataElemType a, char b, DataElemType c);
void FormatExpression(char* src, char* dest);
Status StackEmpty(SqStack S);
Status StackEmpty(DataSqStack S);
Status Push_Data(DataSqStack& S, DataElemType e);
ElemType GetTop(SqStack& s);
Status GetTop(DataSqStack& s, DataElemType& e);
Status EvaluateExpression(char* MyExpression, DataElemType& rlt);
(2)实现功能函数的那些源文件中应该有这些东西:
//include头文件
#include"stack_manager.h"
//全局变量的定义
unsigned char Prior[7][7] =
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'<','<','<','<','<',' ','>'},
{'<','<','<','<','<',' ','='}
};
char OPSET[7] = { '+','-','*','/','(',')','#' };
//功能函数的实现
Status InitStack(SqStack& S)
{
//(略)
}
//……(其余功能函数的实现略)
(3)有主函数的那个源文件里面写:
//include头文件
#include "stack_manager.h"
//main函数
int main()
{
//(略)
system("pause");//(根据需要使用)
return 0;
}
2.纯粹是编译器编译时的问题
我在做那个哈弗曼编码的实习的时候,写好了整个工程,没看出来任何问题,但是Fn F7编译的时候,总是有这个:
1>(源文件名称).obj : error LNK2005: "(函数的返回值类型) __cdecl (函数名(参数列表))" (?(函数名与乱码)@@YA_NPEAUlinknode@@@Z) 已经在(解决方案名称).obj 中定义
1>(可执行程序的路径与名称).exe : fatal error LNK1169: 找到一个或多个多重定义的符号
的报错,莫名其妙。
后来我仔细看了看,也许是这个输出信息里面提到的 …… .obj的问题(可能是在修改代码的时候,编译器的代码解析生成的.obj文件出了一些问题,VS的编译环境太复杂了)(所以有的比赛都用dev的老版本,编译环境简单而统一)
我看到网上有的做法是去修改解决方案的属性,那个太复杂,而且不一定有效。最简单的方法是:
重新新建一个工程,拷贝上你所有的代码。原来的那个工程就不要了。
亲测有效!果然是编译器自己的问题。
3. ……
如果还有其他可能的情况,欢迎在评论区补充哦!我会及时加进去的!