前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >链接时无法解析符号checklist

链接时无法解析符号checklist

作者头像
gaigai
发布2019-08-30 14:02:12
2.4K0
发布2019-08-30 14:02:12
举报
文章被收录于专栏:Windows开发

链接时报错提示无法解析的外部符号,可能是哪些原因导致?

主要原因包括四类:函数声明与实现的原型不一致、函数声明与实现的作用域不同、函数声明但没有实现、使用DLL接口不当。

函数声明与实现的原型不一致,可能是函数名字、参数、返回值不同。

比如声明时void fun();实现时却是int fun()。

C++与C互相调用也容易因为函数名字不同而无法找到实现,C语言不支持重载,像void fun(int) 的函数名为fun,而C++语言支持重载,函数名就是fun_int与C语言是不一样,这时需要在声明时加上extern “C”,指定使用C的编译链接规约。

函数声明与实现的作用域不同,可能是声明在某个类、某个命名空间下,但实现时没有在该类或该命名空间下。

比如类A声明foo函数,但实现时没有在foo前加上A::,命名空间也是类似,这种情况是编码过程中疏忽了,大脑的定式思维让很简单的问题往往很难发现原因。

函数声明但没有实现,一般情况很容易找到原因,有2种特殊情况要注意。

第一, 一些开源库很强大、很健壮,编译时通过宏定义配置,决定编译的代码块。使用时指定的宏定义配置与编译时不同,导致头文件声明某个函数,但未实现。比如libcurl库有一个配置是否支持XP,如果编译时没有指定支持,使用时却指定要支持XP,必然导致一些XP系统相关的接口未实现。

第二, 因为某些原因导致源码的更新时间戳不对,编译器判断源文件没变化未重新编译,新的代码变化没生效,这时可以选择重新编译。

使用DLL接口不当,包括:未引入正确lib库,接口未导出。

未引入正确lib库是很常见的问题,比如使用PathFileExists API,但没有引入shlwapi.lib。

接口未导出,使用Dependency工具确认接口导出、接口名字正确。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Windows开发 微信公众号,前往查看

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

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

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