1.根本原因
原因:__report_rangecheckfailure 是用来检查堆栈缓存溢出的,如果编译的时候打开GS(project property--》Configuration properties--》c/c++--》Code generation--》Buffer security check)选项时(GS编译选项解析),编译器将为你加入检测函数堆栈缓存溢出错误额外代码。具体实现在window下的运行时库文件msvcrt.dll中。而这些检查堆栈缓存溢出的代码中在msvcrt11.dll及以后版本中都会调用到__report_rangecheckfailure 函数,所以当你用vs2010及以前版本进行开发,并使用了由vs2012及以后编译器编译的库文件时,在链接的时候就会报这样的错误。
解决办法:打开项目属性,C/C++——代码生成——安全检查——禁用安全检查(GS)(修改后并没有用,还是报错)
2、直接原因
可以明确知道无法解析的外部符号是某个自己编译的动态链接库的时候,多半是动态链接库引入不正确。项目属性连接的库:
2.1 可能是lib没有引入正确,检查路径对不对,名称对不对。
选中项目名称右键——属性——连接器——常规——附加库目录——这里是lib文件所在的路径
选中项目名称右键——属性——连接器——输入——附加依赖性——这里是lib文件的名称,比如mmpadpater.lib
2.2 也可能是没有把dll文件放到项目目录下面。
网上有说放到输出目录的,有说和输出目录平级的,我感觉都可以,连接器会一个一个去找的。如果不放心,就两个地方都放。
2.3 还可能是编译库用的位数和编译项目用的位数不同(64位,底层库一定要是64位的库)。
如果项目编译是32位,库编译用的是64位,那肯定会直接抛出错误的。
如果项目编译是64位,库编译用的是32位,那不会直接抛出错误,只有一个警告,但是,这个Warning也是问题的所在,你会发现无法解析的外部符号的问题,并且翻烂了网页试遍了各种办法还是不能解决。