VS2013的LINK2005问题解决方案(仅限由第三方库造成的问题)+ 附LNK2038

来源:互联网 发布:java多线程售票系统 编辑:程序博客网 时间:2024/06/06 01:03

最近荡的别人的代码做大作业,结果各种问题层出不穷,非常郁闷,本想着泡泡通过直接上交,却没想到陷入无解状态,好在查了各种博客之后,终于找到了解决方案,现记录如下。(由于小白一枚,用语不严谨,以理解问题、解决问题为第一要义,请见谅)


-------------------------------------------------分割线


一.问题说明

通常我们在编写程序时,或多或少都会用到第三方库,甚至不止一个第三方库,这时就会存在一个代码兼容问题(库与库之间,库与我们的工程之间)。

在“属性->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,暂未遇到,无心查阅,等碰到了在给出具体方案。

1 0
原创粉丝点击