VS2013的LINK2005问题解决方案(仅限由第三方库造成的问题)+ 附LNK2038
2017-05-14 12:11
363 查看
最近荡的别人的代码做大作业,结果各种问题层出不穷,非常郁闷,本想着泡泡通过直接上交,却没想到陷入无解状态,好在查了各种博客之后,终于找到了解决方案,现记录如下。(由于小白一枚,用语不严谨,以理解问题、解决问题为第一要义,请见谅)
-------------------------------------------------分割线
一.问题说明
通常我们在编写程序时,或多或少都会用到第三方库,甚至不止一个第三方库,这时就会存在一个代码兼容问题(库与库之间,库与我们的工程之间)。
在“属性->C/C++->代码生成”的运行库选项下我们可以看到有多种模式,这些模式决定了生成的代码在运行时所采用的方式(或者说使用的运行库)不同的第三方库(.lib文件)在使用cmake+VS方式(其他方式不了解,理论上应该一样)生成时,也有该属性,因此相当于在你生成相应的第三方库的.lib文件等文件时,就已经确定了相应库文件的运行库,因此你在调用第三方库运行代码时,如果使用的运行库与第三方库不一样,就可能导致重定义问题,因为由于工程中存在多重运行库,因此就会编译多个运行库,而在不同的运行库中,有很多的定义是一样的,因此就会导致重定义的问题.SO,BINGO,问题就这样发生了,伴随着几十上百的错误,让人绝望!
二.解决方案
问题弄明白了,就轮到解决方案了!
1.简单粗暴
在”属性->链接器->命令行“中添加:/FORCE:MULTIPLE,相信大家看懂了什么意识,就是强迫采用多线程的编译方式。通常这样一般就可以解决问题了,但问题在于,多线程也有多种方式,因此就又产生下面的终极解决方案。(两者可以一起使用,多重保险更放心,建议先尝试一,再加上二)
2.从根本上解决问题
既然已经知道是生成相应的第三方库使用运行库不一致产生的问题,那就直接在“属性->C/C++->代码生成”中将运行库修改成一样后重新生成再使用,然后自己的工程文件也使用一样的运行库就OK了
三.话外余音
1.对于运行错误:error
LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”,通过以上的分析可以看到,MDd和MTd指的就是两种运行库,因此,这通常是由于第三方库和项目自身的运行库不匹配造成的,所以你可以直接修改项目自身的运行库,或者同样去修改第三方库的运行库重新生成,
2.有时,导致LNK2005的原因与运行库无关,这时有种解决方案是直接确定各种库的链接先后顺序,然后强制链接器按照正确的顺序链接相应的库,具体操作请自行stackflow,暂未遇到,无心查阅,等碰到了在给出具体方案。
-------------------------------------------------分割线
一.问题说明
通常我们在编写程序时,或多或少都会用到第三方库,甚至不止一个第三方库,这时就会存在一个代码兼容问题(库与库之间,库与我们的工程之间)。
在“属性->C/C++->代码生成”的运行库选项下我们可以看到有多种模式,这些模式决定了生成的代码在运行时所采用的方式(或者说使用的运行库)不同的第三方库(.lib文件)在使用cmake+VS方式(其他方式不了解,理论上应该一样)生成时,也有该属性,因此相当于在你生成相应的第三方库的.lib文件等文件时,就已经确定了相应库文件的运行库,因此你在调用第三方库运行代码时,如果使用的运行库与第三方库不一样,就可能导致重定义问题,因为由于工程中存在多重运行库,因此就会编译多个运行库,而在不同的运行库中,有很多的定义是一样的,因此就会导致重定义的问题.SO,BINGO,问题就这样发生了,伴随着几十上百的错误,让人绝望!
二.解决方案
问题弄明白了,就轮到解决方案了!
1.简单粗暴
在”属性->链接器->命令行“中添加:/FORCE:MULTIPLE,相信大家看懂了什么意识,就是强迫采用多线程的编译方式。通常这样一般就可以解决问题了,但问题在于,多线程也有多种方式,因此就又产生下面的终极解决方案。(两者可以一起使用,多重保险更放心,建议先尝试一,再加上二)
2.从根本上解决问题
既然已经知道是生成相应的第三方库使用运行库不一致产生的问题,那就直接在“属性->C/C++->代码生成”中将运行库修改成一样后重新生成再使用,然后自己的工程文件也使用一样的运行库就OK了
三.话外余音
1.对于运行错误:error
LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”,通过以上的分析可以看到,MDd和MTd指的就是两种运行库,因此,这通常是由于第三方库和项目自身的运行库不匹配造成的,所以你可以直接修改项目自身的运行库,或者同样去修改第三方库的运行库重新生成,
2.有时,导致LNK2005的原因与运行库无关,这时有种解决方案是直接确定各种库的链接先后顺序,然后强制链接器按照正确的顺序链接相应的库,具体操作请自行stackflow,暂未遇到,无心查阅,等碰到了在给出具体方案。
相关文章推荐
- 疑难杂症:解决由早期版本的Web应用项目模板造成的VS 2005 SP1 Beta的问题
- 3D游戏编程大师技巧第一章 vs2013编译书本源码问题解决方案
- 疑难杂症:解决由早期版本的Web应用项目模板造成的VS 2005 SP1 Beta的问题
- vs 2005 Updating Intellisense...占用cpu资源过高的问题解决参考方案
- VS2013安装配置Qt5.4.1及所遇问题解决方案
- VS2013 warning LNK4099:未找到 PDB“vc120.pdb”xxxx 问题解决方案
- Win8.1中VS2013引用第三方dll遇到的问题和解决方法
- WIN7 + VS2013 使用c++创建项目各种报错问题解决方案
- vs2013 在win7下,使用c++创建项目各种报错问题解决方案
- vs2013_qt提示x64和x86冲突问题解决方案
- Visual Studio 2005(c#)项目调试问题解决方案集锦
- Sql Server 2005 与Sql Server Mobile(Sql server 2005 mobile Edition)数据同步步骤以及问题解决方案
- 网络打印机提示的“功能地址0x造成了一个保护错误”问题解决方案
- Visual Studio 2005(c#)项目调试问题解决方案集锦
- 应对vs更新程序引用集的小bug问题的方案 很不可思议的解决方法
- 解决:VS 2005/2008 中 fstream 不能处理带有中文路径的问题
- 解决:VS 2005/2008 中 fstream 不能处理带有中文路径的问题
- datagrid因排序造成的添加删除问题解决方案
- datagrid因排序造成的添加删除问题解决方案
- Visual Studio 2005 Web 项目在Vista中断调试问题解决方案