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

遇到问题我最喜欢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 includesymbol.

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)

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

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

C Run-Time Libraries (CRT)C run-time libraryAssociated DLLCharacteristicsOptionPreprocessor directives

libcmt.libNone,static link.Multithreaded, static link_MT

msvcrt.libmsvcr90.dllMultithreaded, 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._MT, _DLL

libcmtd.libNone,static linkMultithreaded, static link (debug)/MTd_DEBUG,_MT

msvcrtd.libmsvcr90d.dllMultithreaded, dynamic link (import library for MSVCR90D.DLL) (debug)./MDd_DEBUG,_MT, _DLL

msvcmrt.libmsvcm90.dllC Runtime import library. Used for mixed managed/native code./clr

msvcurt.libmsvcm90.dllCRuntime importlibrary compiled as      100% pure MSIL code. All code complies with the ECMA URT spec for MSIL./clr:pure

Standard C++ Library

Standard C++ LibraryCharacteristicsOptionPreprocessor directives

LIBCPMT.LIBMultithreaded, static link/MT_MT

MSVCPRT.LIBMultithreaded, dynamic link (import library for MSVCP90.dll)/MD_MT, _DLL

LIBCPMTD.LIBMultithreaded, static link/MTd_DEBUG, _MT

MSVCPRTD.LIBMultithreaded, dynamic link(importlibrary 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库。所以按顺序修改即可

C语言error2005,关于ERROR LNK 2005错误相关推荐

  1. MFC LNK 2005错误

    为什么会出现这个错误??"error LNK2005: 已经在*.obj中定义"  编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难解决的错 ...

  2. c语言中错误c2061,error C2061: 语法错误: 标识符“_Wherenode”

    昨天同事说,类里加了个静态的vector类型的公共成员后,在其他类里调用,操作该成员,编译出错. 1>d:\program files\microsoft visual studio 9.0\v ...

  3. R语言问题解决:Error: Discrete value supplied to continuous scale

    R语言问题解决:Error: Discrete value supplied to continuous scale #仿真数据 set.seed(123) my_df1 <- data.fra ...

  4. 逐鹿工具显示服务器错误连接不上怎么解决,win7系统安装逐鹿工具箱提示“error launching installer”错误的解决方法...

    win7系统使用久了,好多网友反馈说win7系统安装逐鹿工具箱提示"error launching installer"错误的问题,非常不方便.有什么办法可以永久解决win7系统安 ...

  5. Bug(九) —— error LNK 2019 无法解析的外部符号 __imp__timeGetTime@0

    错误显示: error LNK 2019 无法解析的外部符号 __imp__timeGetTime@0,该符号在函数 "public: virtual void __thiscall Vie ...

  6. 为什么c语言加法错误,分数的加减法——C语言初学者代码中的常见错误与瑕疵(12)...

    重构 题目的修正 我抛弃了原题中"其中a, b, c, d是一个0-9的整数"这样的前提条件,因为这种限制毫无必要.只假设a, b, c, d是十进制整数形式的字符序列. 我也不清 ...

  7. 逐鹿工具显示服务器错误连接不上怎么解决,win7系统中安装逐鹿工具箱时提示“error launching installer”错误怎么解决 Lin...

    延伸:Linux系统在CPAN中安装Perl模块的方法 描述:Perl是编程语言,像C语言一样强大,使用也很方便,可是Perl自带的模块较少,有时需要从CPAN上下载Perl模块,那么Linux系统操 ...

  8. 一针见血 error C2146 语法错误 缺少

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 如果你确 ...

  9. Android使用自定义View时:Error inflating class错误的原因。

    当在布局文件里使用自定义的View的时候,出现Error inflating class错误的原因: 1.没有定义inflate需要的默认构造函数: eg:自定义View为TestView,需要定义T ...

  10. mysql语句报错1403_GoldenGate SQL error 1403 mapping 错误解决方案

    GoldenGate SQL error 1403 mapping 错误解决方案 故障现象: 2011-09-06 15:45:29 WARNING OGG-01004 Oracle GoldenGa ...

最新文章

  1. 人脸识别引擎SeetaFaceEngine中Alignment模块使用的测试代码
  2. shell命令查阅端口信息_短小强大的8个Linux命令,分分钟帮你提高工作效率!
  3. simulink和psim仿真结果不同_CAE仿真分析规范是什么?涨知识啦!
  4. Ubuntu单用户修改root密码
  5. android 背景切换动画效果代码,在Android应用中以模糊效果设置背景图片
  6. Java学习路线(完整详细版)
  7. 从「蒸汽时代」到「高铁时代」,SUNMI DevOps 转型之路 | 原力计划
  8. linux串口 demo 解析原创 代码没有完全测试
  9. Docker系列(二)Docker安装与启动
  10. OpenCV---轮廓发现
  11. matlab10的阶层怎么输入,matlab阶乘和程序
  12. 吊打迅雷,最好用的BT种子下载器,下载不限速
  13. JavaScript的封装方法
  14. 微信聊天记录做成词云~
  15. 简述no less than和not less than区别
  16. 用键盘输入一位整数,当输入1~7时,显示对应的英文星期名称的缩写。
  17. 解线性方程组c语言实验报告,实验五线性方程组的迭代法实验
  18. ASP.NET Session详细介绍
  19. 小程序与后台 api接口数据交互详解(微信报修小程序源码讲解七)
  20. 怎样自己定制标签(Custom Tag)

热门文章

  1. 指纹机和计算机无法连接,考勤机怎么连接到电脑?考勤机连接电脑之后操作指南!...
  2. sql添加字段并设置外键
  3. 区块链ppt资料准备
  4. NVIDIA JETSON TX2上运行yolo3
  5. linux内核hack,怎么Hack Linux的内核符号?
  6. 【计算机网络】—网络编程(socket)02
  7. linux mingw32安装,在Linux上安装mingw
  8. 群晖linux怎么进入u盘,超级简单,群晖系统的U盘制作和安装指导,实现家庭云...
  9. 基于k8s的CICD实现
  10. vyos使用flask