关于ERROR LNK 2005错误

2024-02-29 18:18
文章标签 error 错误 2005 lnk

本文主要是介绍关于ERROR LNK 2005错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于ERROR LNK 2005错误

相信很多人对这个错误是一点也不陌生,甚至有些害怕,我也一样。其实自己遇到过这样的问题,也每次都解决了这样的问题,但关键是自己没总结,所以总是再遇到再改,很烦人,查资料也麻烦。现在有时间了总结下。

遇到问题我最喜欢F1,所以还是先看MSDN是怎么说的:

To fix by checking the following possible causes

1.  Mixing static and dynamic libraries when also using /clr.

2.  The symbol is a packaged function (created by compiling with /Gy) and was included in more than one file but was changed between compilations. Recompile all files that include symbol.

3.  The symbol is defined differently in two member objects in different libraries, and both member objects were used.

4.  An absolute is defined twice, with a different value in each definition.

5.  A header file declared and defined a variable. Possible solutions include:

·         Declare the variable in .h: extern BOOL MyBool; and then assign to it in a .c or .cpp file: BOOL MyBool = FALSE;.

·         Declare the variable static.

·         Declare the variable selectany.

6.  If you use uuid.lib in combination with other .lib files that define GUIDs (for example, oledb.lib and adsiid.lib).

7.     To fix, add /FORCE:MULTIPLE to the linker command line options, and make sure that uuid.lib is the first library referenced.

 

其中1,我一直说学习托管编程,但只是打雷。其实使用托管就是不使用C++的编译器,而是编译成

中间语言,这样可以充分利用.Net的庞大的类库,不熟悉不说,以后学习了可以补上。

其实遇到这个错误并不可怕,只要我们找出原因,知道为什么会引起这些错误后,就不难解决。根据自己平时的心得和MSDN的解释,主要有下面这些情况,可能引起lnk 2005错误。

A、 全局变量的重复定义,在实际的编程中我们应该尽量不使用全局变量。她会产生如下的错误:

AAA.obj error LNK2005 int book c?book@@3HA already defined in BBB.obj

其实这个错误很好找,book@@3HA这个就是你重复定义了的变量。至于是怎么重复定义,情况

很多。关键是要理解清楚变量的声明和定义,以及extern关键字的使用,这些是基础知识。

 

B、 文件的重复包含,因为头文件中会有很多的变量,函数声明,所以要是被重复无次序包含的话,就有可能产生lnk 2005错误。

解决方法是使用#ifndef #define #endif宏来预防头文件被多次包含时重复编译。或者使用#pragma once做预编译。

 

C、 库版本包含错误,这个里面分两种情况说下。

1、 第三方库引起错误,这个在做directshow程序的时候记忆尤为深刻。现在自己把那个库分别编译成了strmbasd.lib、strmbasd_Unicode.lib、strmbase.lib、strmbase_Unicode.lib,这样根据不同的版本和字符编码链接不同的库,就不会出现错误。这样问题没什么好多,自己注意就是。

2、 关于编译器编译选项设置引起的lnk 2005错误。如:

1>MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __vsnwprintf_s already defined in LIBCMTD.lib(vswprnc.obj)

1>MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __vsnprintf_s already defined in LIBCMTD.lib(vsnprnc.obj)

1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)

1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)

        关于这个问题首先看http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx

        我们应该搞清楚这些编译选项的区别和作用,它对我们编译程序有很好的作用。不然我很容易因

为编译选项选错而链接了错误的版本。关于编译选项所对应的链接库,可以参考msdn以下连接:

     http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx

C Run-Time Libraries (CRT)

 

C run-time library

Associated DLL

Characteristics

Option

Preprocessor directives

libcmt.lib

None,static link.

Multithreaded, static link

/MT

_MT

msvcrt.lib

msvcr90.dll

Multithreaded, dynamic link (import library for MSVCR90.DLL). Be aware that if you use the Standard C++ Library, your program will need MSVCP90.DLL to run.

/MD

_MT, _DLL

libcmtd.lib

None,static link

Multithreaded, static link (debug)

/MTd

_DEBUG,_MT

msvcrtd.lib

msvcr90d.dll

Multithreaded, dynamic link (import library for MSVCR90D.DLL) (debug).

/MDd

_DEBUG,_MT, _DLL

msvcmrt.lib

msvcm90.dll

C Runtime import library. Used for mixed managed/native code.

/clr

 

msvcurt.lib

msvcm90.dll

CRuntime importlibrary compiled as      100% pure MSIL code. All code complies with the ECMA URT spec for MSIL.

/clr:pure

 

 

 

Standard C++ Library

 

Standard C++ Library

Characteristics

Option

Preprocessor directives

LIBCPMT.LIB

Multithreaded, static link

/MT

_MT

MSVCPRT.LIB

Multithreaded, dynamic link (import library for MSVCP90.dll)

/MD

_MT, _DLL

LIBCPMTD.LIB

Multithreaded, static link

/MTd

_DEBUG, _MT

MSVCPRTD.LIB

Multithreaded, dynamic link (import library for MSVCP90D.DLL)    

/MDd        

_DEBUG, _MT, _DLL

 

根据给出的信息,以及上面两个表的分析。

我们配置的是/MTd。也即是多线程的DLL的Debug版本,当设置编译器选项为/MTd的时候,编译器

会将库名 LIBCMTD.lib放入.obj文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。所以要将MSVCRTD.lib这个库去掉,方法如下图:

 

 

  

 

              注意:这个种情况问题的解决是需要我们根据自己的配置来分析,要那些库,不要那些库,不要硬套。

 

D、error LNK2005: _DllMain@12 already defined in XXX.obj 处理方
当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误时,可能会出现以下

LNK2005 错误之一:
mfcs40d.lib(dllmodul.obj):error LNK2005:_DllMain@12 already defined in
MSVCRTD.LIB (dllmain.obj) 
mfcs42d.lib(dllmodul.obj):error LNK2005:_DllMain@12 already defined in
msvcrtd.lib(dllmain.obj) 

CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和

DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。 所以按顺序修改即可


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/li_007/archive/2008/08/20/2801781.aspx

这篇关于关于ERROR LNK 2005错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759632

相关文章

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解

CentOS 7 YUM源配置错误的解决方法

《CentOS7YUM源配置错误的解决方法》在使用虚拟机安装CentOS7系统时,我们可能会遇到YUM源配置错误的问题,导致无法正常下载软件包,为了解决这个问题,我们可以替换YUM源... 目录一、备份原有的 YUM 源配置文件二、选择并配置新的 YUM 源三、清理旧的缓存并重建新的缓存四、验证 YUM 源

python3 pip终端出现错误解决的方法详解

《python3pip终端出现错误解决的方法详解》这篇文章主要为大家详细介绍了python3pip如果在终端出现错误该如何解决,文中的示例方法讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下... 目录前言一、查看是否已安装pip二、查看是否添加至环境变量1.查看环境变量是http://www.cppcns

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

正则表达式r前缀使用指南及如何避免常见错误

《正则表达式r前缀使用指南及如何避免常见错误》正则表达式是处理字符串的强大工具,但它常常伴随着转义字符的复杂性,本文将简洁地讲解r的作用、基本原理,以及如何在实际代码中避免常见错误,感兴趣的朋友一... 目录1. 字符串的双重翻译困境2. 为什么需要 r?3. 常见错误和正确用法4. Unicode 转换的

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见