找到一个或多个多重定义的符号的问题

一、问题描述

当一个变量或者函数在头文件定义时,如果被多个源文件包含,就会出现连接错误:error LNK2005: "..." ...已经在 ... 中定义fatal error LNK1169: 找到一个或多个多重定义的符号,原因是这个头文件在多个源文件中展开,从而导致了重定义。

  • 头文件定义变量时发生此错误:
  • 头文件定义函数时发生此错误:

二、解决方法:

  • 解决头文件定义变量时发生此错误:

1.在头文件中用 extern 声明变量,然后定义它并选择性地在唯一的源文件中进行初始化。 此变量现在是全局变量,可通过将其声明为 extern(例如,通过包含头文件)在任何源文件中使用。 对于必须是全局变量的变量,建议使用此解决方案,但良好的软件工程做法可以最大程度地减少全局变量。

2.将变量声明为 static。 这将定义的范围限制为当前对象文件,并允许多个对象文件拥有自己的变量副本。 不建议在头文件中定义静态变量,因为可能会与全局变量混淆。 建议将静态变量定义移动到使用它的源文件。

  • 解决头文件定义函数时发生此错误:

1.将函数声明和定义分离

2.将函数定义成静态函数,因为静态函数的链接属性,只在当前文件可见

3.将函数定义成内联函数

参考:

链接器工具错误 LNK2005 | Microsoft Learn

相关推荐
小酒丸子几秒前
基于QT和C++的实时日期和时间显示
c++·qt
弓.长.25 分钟前
【leetcode刷题】:双指针篇(有效三角形的个数、和为s的两个数)
c++·算法·leetcode
thisiszdy1 小时前
<C++> XlsxWriter写EXCEL
c++·excel
14_112 小时前
Cherno C++学习笔记 P51 创建并使用库
c++·笔记·学习
就叫飞六吧3 小时前
51 单片机和 STM32 引脚命名对照表与解析
c++·stm32·单片机·嵌入式硬件·51单片机
霜雪殇璃3 小时前
c++对结构体的扩充以及类的介绍
开发语言·c++·笔记·学习
冉佳驹3 小时前
C++ ——— 匿名对象
c++·学习·类和对象·匿名对象
誓约酱4 小时前
git的基本使用
linux·运维·服务器·c++·git·后端
范纹杉想快点毕业4 小时前
XML通过HTTP POST 请求发送到指定的 API 地址,进行数据回传
xml·c语言·开发语言·数据结构·c++·python·c#
float_六七4 小时前
C/C++头文件locale
c语言·开发语言·c++