前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编译链接过程中出现“无法解析的外部符号”,原因及解决办法总结

编译链接过程中出现“无法解析的外部符号”,原因及解决办法总结

作者头像
全栈程序员站长
发布2022-08-03 11:10:32
1.2K0
发布2022-08-03 11:10:32
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

1、错误为:error LNK2019: 无法解析的外部符号 ___report_rangecheckfailure,该符号在函数 _OBJ_create_objects 中被引用

原因:__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、可以明确知道无法解析的外部符号是某个自己编译的动态链接库的时候,多半是动态链接库引入不正确,不正确的原因:

(1)使用资源管理器,项目属性来连接的库。

》可能是lib没有引入正确,检查路径对不对,名称对不对。

选中项目名称右键——属性——连接器——常规——附加库目录——这里是lib文件所在的路径

选中项目名称右键——属性——连接器——输入——附加依赖性——这里是lib文件的名称,比如mmpadpater.lib

》也可能是没有把dll文件放到项目目录下面,网上有说放到输出目录的,有说和输出目录平级的,我感觉都可以,连接器会一个一个去找的。如果不放心,就两个地方都放。

》还可能是编译库用的位数和编译项目用的位数不同。

如果项目编译是32位,库编译用的是64位,那肯定会直接抛出错误的。

如果项目编译是64位,库编译用的是32位,那不会直接抛出错误,只有一个警告,但是,这个Warning也是问题的所在,你会发现无法解析的外部符号的问题,并且翻烂了网页试遍了各种办法还是不能解决。理论上64位的用32位的是没有问题的,我也不知道为什么。

(2)直接把lib文件添加进项目以引入库。

可能是没有把dll文件放进来

也可能是上面的bite问题。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/124921.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档