链接时无法解析符号checklist

December 09, 2023
测试
测试
测试
测试
1 分钟阅读

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

主要原因包括四类:函数声明与实现的原型不一致、函数声明与实现的作用域不同、函数声明但没有实现、使用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工具确认接口导出、接口名字正确。

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多