编译时报错“fatal error LNK1169: 找到一个或多个多重定义的符号”的可能原因及其解决办法

在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. ……

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

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值