VC的链接错误LNK2005详解

VS2019 C++项目同时出现LNK2005 和LNK1169 error 的解决办法 同时出现LNK2005 和LNK1169 error 的解决办法项目场景:问题描述:原因分析:cpp引用cpp导致报错解决方案:问题总结 项目场景: Visual Studio 的C++ 项目中,在main.cpp中引入LinkStack.cpp时会出现以下报错: 问题描述: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK1169 找到一个或多个多重定义的符号 queue2 F:\Cplusplus\queue2\Debug\queue2.exe 1 警告 C6011 取消对 NULL 指 阅读详情

编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误。弄清楚它形成的原因,就可以轻松解决它了。
造成LNK2005错误主要有以下几种情况:
1.重复定义全局变量。可能存在两种情况:
A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。正确的应该是在 一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern int g_Test即可,如果还是使用int g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 int book c? mailto:book@@3HAalready 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等其他库,逐一尝试。
这就是我所遇到过的LNK2005错误的几种情况,肯定还有其他的情况也可能造成这种错误,所以我不希望你在看完这篇文章以后,再遇到LNK2005错误时候,不动脑筋的想对号入座的排除错误。编程的过程就是一个思考的过程,所以还是多多开动你的头脑,那样收获会更多!
=======================================
支持,我在社区里也看到了许多LINK 2005错
补充一点,就是一次在用第三方库时,由于errno被重定义,用多种方法都不能解决,后查找MSDN,发现link有个选项/FORCE可以解决,在IDE下
Project->Settings->Link页,选categroy为custom,将force file output前打勾
但会有警告
warning LNK4088: image being generated due to /FORCE option; image may not run
但的确解决了问题,这是由于VC对重定义比较严格,像BCB或GCC在库中的重定义不会有任何警告或错误
========================================
我发现的另外一个出现LINK2005的现象,好像是由于名称空间而引起的。我在dos下写的程序没有问题,但是放在mfc中就出现了这个链接错误。因为 起初图省事,我在一个头文件中写了using namespace std,并且这个头文件我多处使用,另外,我还使用了boost库。后来,问题解决的方法非常奇怪,在一个头文件中引用其他头文件,这些头文件的顺序换一 下就通过了,那个出现问题的头文件中我使用了std::map,当我把这种容器使用模板代替后,链接就有没事了。(例如:template< class coll>),后来感到模板技术还有这种效果,赚了!哈哈
========================================

What are the C and C++ libraries my program would link with?

                       Summary Table

Compile   Old             New IOStream    Libraries

Option     IOStream    or STL                Linked With
 

 
/ML        No                No                   LIBC.LIB
 
/MLd      No                No                   LIBCD.LIB
 
/MT        No                No                   LIBCMT.LIB
 
/MTd      No                No                   LIBCMTD.LIB
 
/MD       No                 No                    MSVCRT.LIB
 
/MDd     No                 No                    MSVCRTD.LIB
 
/ML        No                Yes                   LIBC.LIB,     LIBCP.LIB
 
/MLd      No                 Yes                   LIBCD.LIB,   LIBCPD.LIB
 
/MT        No                Yes                   LIBCMT.LIB,  LIBCPMT.LIB
 
/MTd      No                 Yes                    LIBCMTD.LIB, LIBCPMTD.LIB
 
/MD        No                 Yes                   MSVCRT.LIB,  MSVCPRT.LIB
 
/MDd      No                Yes                   MSVCRTD.LIB, MSVCPRTD.LIB
 
/ML        Yes                No                   LIBC.LIB,      LIBCI.LIB
 
/MLd      Yes                No                   LIBCD.LIB,    LIBCID.LIB
 
/MT        Yes                No                    LIBCMT.LIB,   LIBCIMT.LIB
 
/MTd      Yes                No                    LIBCMTD.LIB, LIBCIMTD.LIB
 
/MD        Yes               No                    MSVCRT.LIB,  MSVCIRT.LIB
 
/MDd      Yes               No                   MSVCRTD.LIB, MSVCIRTD.LIB
 


你的程序使用了/ML编译选项,而程序依赖的.lib可能使用/MDd选项编译,造成链接冲突.

统一编译选项可回避此错误
Project Settings->C/C++ Tab->Category:CodeGeneration
Use run-time library组合框中选择Multithread Dll(或Debug Multithread Dll )

Summary Table for CRT DLLs Used

Import Library Linked With
 DLLs Used (Visual C++ 5.0|6.0)
 DLLs Used (Visual C++ 4.2)
 DLLs Used (Visual C++ .NET 2002| Visual C++ .NET 2003)
 
MSVCRT.LIB
 MSVCRT.DLL
 MSVCRT.DLL
 MSVCRT.DLL
 
MSVCRTD.LIB
 MSVCRTD.DLL
 MSVCRTD.DLL
 MSVCRTD.DLL
 
MSVCPRT.LIB
 MSVCP(5|6)0.DLL
 
 MSVCP7(0|1).DLL
 
MSVCPRTD.LIB
 MSVCP(5|6)0D.DLL
 
 MSVCP7(0|1)D.DLL
 
MSVCIRT.LIB
 MSVCIRT.DLL
 MSVCIRT.DLL
 
 
MSVCIRTD.LIB
 MSVCIRTD.DLL
 MSVCIRTD.DLL
 
 


注意:所有相关工程都应该选择相同编译选项
========================================
微软的MSDN中查到信息的
可能的原因
不慎同时与单线程库和多线程库链接。确保应用程序项目文件只包括适当的库,并且任何第三方库已适当创建了单线程或多线程版本。
该符号为封装函数(通过用 /Gy 编译创建),包含在多个文件中,但在各编译间已改变。重新编译所有包含 symbol 的文件。
以不同的形式在不同库中的两个成员对象中定义了该符号,并且使用了这两个成员对象。
某个绝对符号被定义两次,而每次定义的值不同。
头文件声明并定义了变量。可能的解决方案有:
在 .h 中声明变量:extern BOOL MyBool;,然后在 .c 或 .cpp 文件中向它分配:BOOL MyBool = FALSE;。
将变量声明为 Static。
将变量声明为 selectany。
当将 uuid.lib 与定义 GUID 的其他 .lib 文件(例如 oledb.lib 和 adsiid.lib)一起使用时。例如:
oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject
already defined in uuid.lib(go7.obj)
若要修复,请将 /FORCE:MULTIPLE 添加到链接器命令行选项,并确保 uuid.lib 是引用的第一个库。
有关更多信息,请参阅知识库文章:
Q148652,PRB: LNK2005 Errors When Link C Run-Time Libraries Are Linked Before MFC Libraries。
Q140440,FIX: Global Overloaded Delete Operator Causes LNK2005。
Q184235,PRB: LNK2005 Errors on New and Delete When Defining _ATL_MIN_CRT。
该错误之后为致命错误 LNK1169。
=======================================
有时候因为工程使用了预编译头文件并且是增量编译,所以当你改动以后可能也会出现LNK2005错误,提示“XXXX已经在XXXX.obj文件中定义”的消息,这时候只要Rebuild All一般都能解决问题。这是因为头文件的顺序被改动等等操作造成的。
最后要说明的:事物是在不断变化中的,C++的标准在变化,编译器也在变化,所以并不是所有的LNK2005错误都可以在这里找到答案,但是至少它能给你以提示。学习并思考才是正确的!

 

VC6项目集成Parasoft C/C++test:解决LNK2005链接错误实战指南 在C/C++软件开发中,单元测试是保障代码质量、支持重构的关键实践。其核心原理是通过编写测试用例,验证函数或模块在隔离环境下的行为是否符合预期。对于大型项目,自动化测试框架能显著提升测试效率和覆盖率。在嵌入式或遗留系统领域,常面临将现代测试框架集成到老旧编译环境(如Visual C++ 6.0)的挑战,其中链接阶段出现的LNK2005“符号重复定义”错误尤为典型。该错误源于编译器链接器在合并多个目标文件时,发现同一全局符号存在多个强定义,这在VC6的严格链接规则下极易触发。解决此类问题不仅能打通自动化测试流 阅读详情

相关推荐

解决VC6 MFC项目LNK2005链接错误:CRT与MFC库冲突原理与实战

在C++项目开发中,链接器(Linker)负责将编译后的目标文件与库文件组合成可执行程序,其核心原理是符号解析与重定位。当不同库中定义了相同符号时,就会引发LNK2005重复定义错误,这本质上是链接顺序与库依赖管理的技术问题。在Windows平台的C++工程实践中,这种冲突常见于C++运行时库(CRT)与MFC框架库之间,尤其是在维护VC6等遗留项目时。CRT提供了标准内存管理函数如operator new/delete的基础实现,而MFC静态库为了支持调试内存检测等功能,也封装了自己的内存管理版本。当项目

weixin_30522983的博客 243

VC++的链接错误LNK2005

VC++的链接错误LNK2005 作者: Jerry Cat时间: 2006/04/19链接: http://www.cppblog.com/jerysun0818/archive/2006/04/19/5913.html 编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误。弄清楚它形成的原因,就可以轻松解决它了。 造成LNK2005错误

tommy_cug的专栏 1454

STM32U575 ADC+DMA+UART数据采集实战:CubeMX配置避坑与代码实现

在嵌入式开发中,ADC采集与DMA传输是提升系统实时性的关键技术。通过DMA将ADC数据直接搬运到内存,可大幅降低CPU占用,实现高效连续采样。结合UART的DMA发送,能进一步解放CPU,适用于工业采集、信号监测等场景。本文以STM32U575为例,详解CubeMX中ADC、DMA、UART的配置要点,包括时钟树、DMAMUX映射、循环模式等,并给出代码实现与常见问题排查,帮助开发者快速构建稳定的数据采集链路。

weixin_29194255的博客 170

LNK2005错误的原因与解决

编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误。弄清楚它形成的原因,就可以轻松解决它了。 造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量。可能存在两种情况: A、对于一些初学编程的程序员,有时候会以为需要使 用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。正确的应该是在一个CP

zhuozhibin的专栏 8127

详解k-means++

一、概述 定义:k-means++是一种为k-means聚类算法选择初始值(或“种子”)的算法。它是NP-hard k-means问题的一种近似算法,它是一种避免标准k-means算法有时发现的较弱聚类的方法。 K-means与K-means++:原始K-means算法最开始随机选取数据集中K个点作为聚类中心,而K-means++按照如下的思想选取K个聚类中心:假设已经选取了n个初始聚类中心(0<n<K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚

qq_42364307的博客 3万+

新版股票配资系统源码/股票分析系统技术方案

新版股票配资系统;全套源码支持新股申购功能,包含C#+MySQL开发的后台系统及Spring框架,采用C/S架构。注意:本源码仅限技术学习、功能测试及模拟交易使用,严禁用于非法用途,违者责任自负。

q318136906的博客 1643

Visual Studio(VS) C++程序LNK2005错误,提示“error LNK2005: _XXX已经在xxx.obj中定义”解决方案

项目中有多个源文件或头文件,include后导致有些变量重复定义,加上Visual Studio新版版要求更严格。

Ps_hello的博客 3605

【OpenClaw从入门到精通】第09篇:企业级实践——将OpenClaw接入钉钉,打造7×24小时数字员工(2026实测版)

本文聚焦OpenClaw的企业级落地实践,以“招聘数字专员”为核心场景,完整演示从钉钉接入到全流程自动化的实现路径。内容涵盖企业级部署架构设计、前置环境搭建、核心技能开发、流程串联、安全权限管控及运维监控六大模块,详解简历解析、岗位匹配、外呼集成、CRM同步、日历提醒等关键技能的构建逻辑与代码实现。借鉴中关村科金、网易智企的企业级实践经验,重点突破企业知识融合、安全权限管控、业务系统连接三大核心门槛,提供可直接参考的配置示例与操作步骤。所有技术方案均基于公开文档与实测验证,兼顾新手入门与进阶实操。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1170

C++造成LNK2005错误主要有以下几种情况:

1.重复定义全局变量。可能存在两种情况: A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。   正确的应该是在一个CPP文件中定义如下:   int g_Test;   那么在使用的CPP文件中就应该使用:   extern int g_Test   即可,如果还是使用int g_Te...

weixin_45790559的博客 1826

Open3D 三维重建-Delaunay Triangulation (德劳内三角剖分)

德劳内三角剖分(Delaunay Triangulation)是一种用于从一组点生成三角形网格的算法。它的特点是使得生成的三角形尽量接近等边三角形,即最大化最小角度,避免生成细长的三角形。

纵马踏花向自由 2502

在 SAP 中启用应收/应付“代扣税(Withholding Tax)”功能,本质上是激活并配置“扩展代扣税(Extended Withholding Tax)”模型

摘要:SAP中启用应收/应付代扣税功能需完成3个层级12个核心步骤:1)全局激活公司代码代扣税功能;2)配置代扣税规则、税率和科目,包括定义税种类型、代码、总账科目等;3)在供应商/客户主数据中关联代扣税设置。完成后系统可在发票或付款环节自动计算并过账代扣税,支持多税种并行计算和税率年度调整,最终生成税务报表。常见问题排查需检查公司代码激活状态和主数据配置。(149字)

金牌架构师 836

VS2005(VC6)出现如下链接错误的解决方法uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsign

最近在VC 6.0上作業,有幾個地方都遇到一個十分惱人的錯誤。就是出現下述的錯誤: Linking... nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) nafxcwd

运用之妙,存乎一心 5532

InVEST模型 | HAbitat quality模块计算生境质量

 本文详细介绍使用InVEST模型中HAbitat quality模块计算生境质量,包含各个参数的含义、所需数据、数据处理以及需要各个参数注意的地方等过程。

地理空间科学的博客 1万+

libcmt.lib(crt0dat.obj) : error LNK2005: _amsg_exit 已经在 MSVCRTD.lib(MSVCR110D.dll) 中定义

问题描述(VC2012): 1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: 默认库“libcmt.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 1>  正在生成代码 1>  已完成代码的生成 1>libcmt.lib(crt0dat.obj) : error LNK2005: _amsg_exit 已经在 MS

swanabin的专栏 9018

代谢组数据分析(四):多种差异分析方法筛选代谢物标记物

本文详细介绍了代谢组学中常用的差异分析方法,包括倍数变化法、T检验、VIP值在OPLS-DA中的应用。通过这些方法,研究者能够筛选出在不同组别间具有显著差异的代谢物,为疾病诊断和治疗提供线索。文章还提供了一个整合的R函数run_metabolomeDA,便于研究人员进行一站式差异分析,并展示了如何生成火山图来可视化结果。

专注生信领域 6772

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VC如何在编译链接程序过程中在输出窗口看到链接的顺序

VC如何在编译链接程序过程中在输出窗口看到链接的顺序 具体操作:选择VC菜单Project-&gt;Settings-&gt;Link页,然后在Project Options的Edit栏中输入/verbose:lib,这样就可以在编译链接程序过程中在输出窗口看到链接的顺序了。 同时这样也可以解决类似:error LNK2005: "void __cdecl operator delete(voi...

qinrenzhi的博客 713

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

error LNK2005: "void __cdecl operator delete类似问题解决办法

碰到了这个问题,在网上找到了解决方案,如下所示: VC缺省链接库的顺序不对导致链接错误error LNK2005: "void __cdecl operator delete(void *)"(??3@YAXPAX@Z) already defined in libcpmt.lib(delop.obj) 在编译工程UDPDriver时,MFC static Library和Code G...

weixin_30703911的博客 167

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC++编译代码出现LNK2005错误的一种情况的解决

在一个VC控制台应用程序中,加入对ADO的引用,编译后,出现如下错误提示, 1>MSVCRTD.lib(MSVCR120D.dll) : error LNK2005: __beginthreadex 已经在 libcmtd.lib(threadex.obj) 中定义 1>MSVCRTD.lib(MSVCR120D.dll) : error LNK2005: __endthreadex

zdleek的专栏 6375

VC lib链接错误的总结

VC lib链接错误的总结 通过dumpbin /DIRECTIVES my.lib查看lib的缺省标准库版本然后调整自己的缺省标准库版本来适应第3方库若要使用此运行时库请忽略这些库单线程 (libc.lib)libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib多线程 (libcmt.li

305

编译和链接 - 解决出现的LNK2005“符号已定义”错误 4

译打包。当再次用 link main.obj my.lib 进行链接时,我们看到了什么?天哪,一堆的LNK2005加上个贵为"fatal error"的LNK1169垫底,当然还少不了那个LNK4098。链接器是不是疯了?不,你冤枉可怜的链接器了,我拍胸脯保证它可是一直在尽心

_Max 811

关于VC工程编译不过去这件事

刚开始接触VC的时候,很大一部分时间是在对付编译链接错误,因为经验不足的原因,这些编译链接总让人很沮丧。比如: 1.fatal error LNK1104: 无法打开文件“LIBC.lib”错误 这个错误是因为库冲突导致的,解决方法如下: 方法一: 用VSDNET2005重新编译某个工程的发生了链接错误 现在把这个解决过程分享一下。 错误如下:fatal error LN...

aaa407217484的博客 232

LNK2005 *** 已经在 *** lib中定义

调试程序的时候下面的错误是经常遇到的,也是很吓人,其实这主要是在vs2005中调用vc6生成的lib或者dll时遇到    1 1&gt;LIBCMT.lib(setlocal.obj) : error LNK2005: __configthreadlocale 已经在 msvcrtd.lib(MSVCR80D.dll) 中定义 2 1&gt;LIBCMT.lib(tidtable.obj...

weixin_33713707的博客 182

VC缺省链接库的顺序不对导致链接错误error LNK2005: "void __cdecl operator delete(void *)"

MFC static Library和Code Generation/MultiThread选项时,链接总出现问题:nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in libcpmt.lib(delop.o

求索 3515

Parasoft C/C++test如何解决在VC6环境中单元测试的LNK2005错误

Parasoft C/C++test是一款专为C/C++代码设计的自动化测试工具,通过静态代码分析、单元测试和运行时错误检测等功能,帮助开发团队在早期发现并修复缺陷,提升代码质量和开发效率 。在实际使用中,尤其是在VC6此类旧版开发环境中执行单元测试时,可能会因环境兼容性问题触发链接错误。

2501_91602431的博客 642
keyanting
博客等级 码龄19年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值