造成LNK2005错误主要有以下几种情况:
1.重复定义全局变量。可能存在两种情况:
A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。正确的应该是在一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern int g_Test即可,如果还是使用int g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 int book c?book@@3HA already defined in BBB.obj。切记的就是不能给变量赋值否则还是会有LNK2005错误。
这里需要的是“声明”,不是“定义”!根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义:
(1)声明必须使用extern关键字;(2)不能给变量赋初值
所以,下面的是声明:
extern int a;
下面的是定义
int a; int a = 0; extern int a =0;
B、对于那么编程不是那么严谨的程序员,总是在需要使用变量的文件中随意定义一个全局变量,并且对于变量名也不予考虑,这也往往容易造成变量名重复,而造成LNK2005错误。
2.头文件的包含重复。往往需要包含的头文件中含有变量、函数、类的定义,在其它使用的地方又不得不多次包含之,如果头文件中没有相关的宏等防止重复链接的措施,那么就会产生LNK2005错误。解决办法是在需要包含的头文件中做类似的处理:#ifndef MY_H_FILE //如果没有定义这个宏
#define MY_H_FILE //定义这个宏
……. //头文件主体内容
…….
#endif
上面是使用宏来做的,也可以使用预编译来做,在头文件中加入:
#pragma once
//头文件主体
3.使用第三方的库造成的。这种情况主要是C运行期函数库和MFC的库冲突造成的。具体的办法就是将那个提示出错的库放到另外一个库的前面。另外选择不同的C函数库,可能会引起这个错误。微软和C有两种C运行期函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的:msvcrt.lib。如果一个工程里,这两种函数库混合使用,可能会引起这个错误,一般情况下它需要MFC的库先于C运行期函数库被链接,因此建议使用支持多线程的msvcrt.lib。所以在使用第三方的库之前首先要知道它链接的是什么库,否则就可能造成LNK2005错误。如果不得不使用第三方的库,可以尝试按下面所说的方法修改,但不能保证一定能解决问题,前两种方法是微软提供的:
A、选择VC菜单Project->Settings->Link->Catagory选择Input,再在Ignore libraries 的Edit栏中填入你需要忽略的库,如:Nafxcwd.lib;Libcmtd.lib。然后在Object/library Modules的Edit栏中填入正确的库的顺序,这里需要你能确定什么是正确的顺序,呵呵,God bless you!
B、选择VC菜单Project->Settings->Link页,然后在Project Options的Edit栏中输入/verbose:lib,这样就可以在编译链接程序过程中在输出窗口看到链接的顺序了。
C、选择VC菜单Project->Settings->C/C++页,Catagory选择Code Generation后再在User Runtime libraray中选择MultiThread DLL等其他库,逐一尝试。
关于编译器的相关处理过程,参考:
http://www.donews.net/xzwenlan/archive/2004/12/23/211668.aspx
相关推荐
全局变量定义和声明使用
【代码】全局变量定义和声明使用。
C++:C++全局变量:看完还不懂全局变量来捶我
C++:C++全局变量:看完还不懂全局变量来捶我
在 ABAP 世界里正确声明变量:告别全局变量,用好封装与对象化思维
摘要 ABAP开发中应避免在程序全局声明区定义变量和字段符号,因其会引发可维护性、并发稳定性和封装性问题。核心规则是将业务状态迁移到类/接口属性或方法局部变量中,仅保留Dynpro和选择屏幕所需的接口变量。在SAP Gateway和OData开发中更需严格管控全局状态,通过请求上下文获取数据并保存在对象实例属性中。正确封装状态可提升代码可读性、可测试性,并适配现代ABAP架构。
C++全局变量
一.全局变量 在所有函数外部定义的变量(通常在函数头部),称为全局变量。其可以被任何函数访问,通俗的说全局变量一旦声明,那么在怎个程序中是可以调用的。并且全局变量的值在程序的整个生命周期都是有效的。 #include<iostream> using namespace std; int num; // 全局变量 num int main() { //对变量初始化 int a = 10; int b = 8; in...
项目管理——14规划绩效域论文套路
规划绩效域论文套路
解决 `version ‘GLIBCXX_3.4.32‘ not found‘ not found` 错误
解决 `version 'GLIBCXX_3.4.32' not found' not found` 错误
正确声明全局变量
通常我们都不太赞成使用全局变量,但有时确实也避免不了。每当使用全局变量或对象时,决不要在头文件中实例化,因为头文件一般都被包含(#include)在几个源文件中。这样,链接器将扫描到相同对象的多个实例并报错。必须在单个源文件中实例化全局变量或对象,只有这样才能保证它只被定义一次,而与工程中使用的源文件数目无关。所有其它的存取该全局对象的源文件和头必须以extern方式来声明。下面是一个例子://
枪支/刀具检测 (gun, knife) - SIXray, Clasp Dataset,YOLOv11+UI界面+数据集
python复制编辑# 计算 CIoU 损失。
c++全局变量的正确声明
C++中全局变量声明错误情况 造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量。可能存在两种情况: A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。正确的应该是在一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern
【问题解决】解决 Python `PermissionError` 权限不足:文件/进程/端口全场景修复
本文总结了Python程序中常见的权限问题及解决方案,包括文件、进程和端口权限错误。文件权限问题通常由文件占用、权限不足或路径错误引起;进程问题多因权限不足或系统限制;端口问题则与端口占用、防火墙或特权端口相关。解决方案提供了详细的代码实现:文件权限管理器类(FilePermissionManager)包含检查权限(check_permission)、修复权限(fix_permission)、安全写入(safe_write)和安全删除(safe_delete)等方法,通过异常处理和临时文件等技术确保操作安全
2026最新华为OD机试新系统机考真题- 真题题库目录|全覆盖题库 + 逐点算法考点详解
2026年4月1日起,华为OD机试正式切换至新系统模式!采用力扣模式,无需自己写输入! 难度大幅度降低。正在备考华为OD机试的同学,优先刷新系统机试真题,可大幅提升通过率。 新系统考题考点与旧版一致,无需重新适应。本专栏所有算法题均配有详细思路解析,并提供C语言、JS、C++、Python、Go、Java多语言源码实现。订阅后私信即可开通专属OJ刷题权限,高效备考一次上岸!
2025年最新C语言教程11-多文件 C 项目中全局变量与函数的正确声明:extern 和头文件拆分指南
本文针对C语言多文件项目中全局变量和函数的声明与定义问题,总结出核心原则:定义只能有一次(分配内存),声明可以有多次(告知类型)。文章详细拆解了全局变量(定义在.c文件,用extern在.h文件声明)和函数(原型在.h声明,实现在.c文件)的正确使用方法,强调声明与定义类型必须完全匹配。同时提出头文件管理规范:头文件只包含共享声明,使用宏守卫防止重复包含,并保持.c与.h文件的明确分工。遵循这些规范可避免90%多文件协作错误,提升代码可维护性。
AI Agent智能体在Android开发中的应用
本文探讨了AIAgent(智能代理体)在Android开发中的应用,涵盖技术原理、实践案例与未来趋势。AIAgent通过机器学习、自然语言处理等技术实现代码生成、测试自动化及性能优化,显著提升开发效率。例如,强化学习模型可优化APP响应时间(公式:$\text{响应时间}=f(\text{负载},\text{资源})$),自动化测试覆盖率提升至95%。
js中在node环境中用this指向global时全局变量的正确声明
自己遇到的bug,希望对你们有帮助 //varname='zs'; name='zs';//node环境中,不能用var声明,不然不能挂载(保存)在global中 varfoo=function(){ varname='ls'; console.log(this.name); } varobj={ name:"terry", foo } foo();//全局变量zs obj.foo();//对象变量terry console....
7 中望CAD二次开发-标注(一)(ZRX C++)
尺寸标注是CAD设计中最常用的功能之一,软件内置了很多标注功能,可以通过使用这些标注工具,对需要标注的长度、角度等一个个进行标注。但这显然效率很低,学习CAD二次开发,就是要把人从重复的劳动中解放出来,实现批量标注。本文介绍,如何通过二次开发进行标注。
使用verilog设计实现QR分解
QR(正交三角)分解法是求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法求特征值和特征向量。 使用verilog对QR实现方法进行设计并进行功能仿真: 如下: 顶层模块代码: module TOP( H1R, H1I, H2R, H2I, H3R, H3I, H4R, H4I, clk, rst_n, Y1R, Y1I, Y2R, Y2I, X1R, X1I, X2R, X2I ); parameter width = 16; // I
全局变量的声明、定义及用法
全局变量的声明、定义及用法 文章目录全局变量的声明、定义及用法1. 编译单元(模块)2. 声明和定义3. extern 作用4. 全局变量(extern)4.1 如果直接将声明和定义都放在头文件中会如何?5. 静态全局变量(static)6. 全局常量(const) 转载自https://blog.youkuaiyun.com/candyliuxj/article/details/7853938 转载自htt...
visio安装包
Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。
Windows下RTAB-Map与RealSense T265三维建图实战指南
SLAM(同步定位与建图)是机器人与三维视觉领域的核心技术之一,它解决的是设备在未知环境中同时估计自身轨迹并构建空间地图的问题。视觉惯性里程计(VIO)通过融合相机与IMU数据,在纹理稀疏或快速运动场景下提供稳定的位姿估计,而RGB-D相机则能直接输出彩色图与深度图,为稠密三维重建提供必要的数据源。RTAB-Map作为一种基于图优化的开源SLAM框架,通过高效的回环检测与全局优化,将里程计与深度数据整合为一致的三维地图。在实际工程中,许多开发者受限于Linux环境门槛,难以在Windows平台复现这套流程。
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
在C++中正确使用多文件和全局变量的方法
假设有这样一段程序: #include <iostream> using namespace std; int a = 12; // 全局变量 void func(int x) { cout << x + a << endl; } int main() { int b = 10; func(b); } 现在希望将func函数单独写为一个文件,...
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
Keil5 C51项目里extern用错,ERROR L104报错怎么破?手把手教你正确声明全局变量
本文深入解析Keil5 C51项目中extern误用引发的ERROR L104报错问题,通过实际案例详细讲解声明与定义的区别,并提供正确的全局变量管理方法。针对C51编译器的特性,分享多文件项目的最佳实践和调试技巧,帮助开发者避免常见错误,提升代码质量。
C++全局变量的声明与定义
1. header1.h中声明全局变量,header1.cpp中定义全局变量 // header1.h #ifndef HEADER1_H_ #define HEADER1_H_ extern int g_n;// 头文件中必须加extern声明全局变量,不赋值 //int g_o;错误 //int g_o = 10;错误 //extern int g_o;错误 #endif
extern声明全局变量的用法
这篇文章主要讲解一下extern声明全局变量的一些用法,虽然知识点比较浅显,但是却容易犯错,仅与那些初学C++的朋友分享,希望没有让大牛们见笑。 extern最基本的用法是声明全局变量的。这里需要注意两点,一是“声明”,二是“全局变量”;我们先来分析这两个概念。 声明:声明和定义是有区别的。声明不等于定义,声明只是指出了变量的名字,并没有为其分配存储空间;定义指出变量名字同时为变量分配存储空间,定义包含了声明。例如...
extern全局变量和全局函数的正确使用方式
对于extern全局变量和函数,使用头文件来声明它们 在定义全局变量和函数的地方include头文件 在使用全局变量和函数的地方include头文件 注:声明和定义变量的区别在于,声明只是告知编译器一个变量存在,它的类型是什么,而没有为变量申请内存空间。定义变量代表它已经被实例化,这个变量有了内存空间。 example: globalVar.h //全局变量声明处 extern int global_variable; globalFun.h //全局函数声明处 extern int incr.
056.Declare Global Variable 声明全局变量
--------------- main.m --------------- #import void change() { // 声明本函数将要使用的全局变量 extern int globalVar; globalVar = 20; } int main() { // 声明本函数将要使用的全局变量
C++中全局变量的使用
在C++中全局变量的定义与使用做一下下面简单的记录,方便日后查阅,也与大家一起学习。 1.全局变量的声明; [1]在头文件.h中进行声明,如果在此文件之外也要使用该变量,则在变量声明前加extern: extern int a; [2]在头文件.h中进行声明,只在该文件中进行使用,不需要加extern; int a; 2.全局变量的定义; 在对应的.cpp文件中进行,无论时加extern修饰的还是没有加extern修饰的,定义方法一样; int a = 1; 3.全局变量的使用 下面以
C++基础之全局变量
C++的水比較深,之前我一直以为C++的全局变量会像其它语言一样,很easy仅仅要在头文件里,定义一个变量就可以,比方以下的test.h:#ifndef _TEST_H #define _TEST_H int a = 10; #endif我都加上头文件保护符,总应该没有多重包括的问题了吧?没想到多个cpp文件引用同个头文件还是狂报错:error LNK2005 a 已经在 xx.obj中定...
685



被折叠的 条评论
为什么被折叠?



