eCos系统无法正确链接到在C++源文件中自定义的cyg_user_start函数的问题和解决办法
2014-09-19 11:39
447 查看
在C++源文件中定义cyg_user_start函数前,将其声明成C函数,即可解决问题。
eCos官网:http://ecos.sourceware.org
eCos中文技术网:http://www.52ecos.net
eCos交流QQ群:144940146。
/article/8120122.html
mingdu.zheng<at>gmail<dot>com
cyg_user_start(void)的最终符号名依然为cyg_user_start。使用nm查看生成的.o文件可以查看符号表,通过查看符号表可以发现这个问题。
eCos官网:http://ecos.sourceware.org
eCos中文技术网:http://www.52ecos.net
eCos交流QQ群:144940146。
/article/8120122.html
mingdu.zheng<at>gmail<dot>com
问题:
在C++源文件中定义cyg_user_start,按照预期最终编译出来的eCos应用在系统初始化后进入该函数,实际运行结果不是。通过调试发现总是进入eCos系统位于infra/<versin>/src/userstart.cxx的默认的cyg_user_start函数。解决:
在定义cyg_user_start函数前,将其声明成C函数。#include <cyg/infra/cyg_type.h> externC void cyg_user_start( void ); // 声明成C函数 void cyg_user_start(void) { …… }
解释:
C++由于需要支持函数重载,因此C++编译器会对函数名进行名称转换,在C++中void cyg_user_start(void)的最终符号名为_Z14cyg_user_startv,而链接器是只认识符号名的,对于连接器而言_Z14cyg_user_startv和cyg_user_start是两个不同的函数,因此不能正确链接到自定义的cyg_user_start函数,使用externC(cyg_type.h中定义的宏,在C++中展开为extern "C")将cyg_user_start函数声明为C函数,C++编译器不会对声明为C函数的函数进行名称转换,voidcyg_user_start(void)的最终符号名依然为cyg_user_start。使用nm查看生成的.o文件可以查看符号表,通过查看符号表可以发现这个问题。
相关文章推荐
- eCos系统无法正确链接到在C++源文件里自己定义的cyg_user_start函数的问题和解决的方法
- 如何自定义JSTL标签(在oa系统中用JSTL函数解决即时认证问题)
- 怎么解决“无法访问G:\ 函数不正确”的问题
- 无法将函数定义与现有的声明匹配 问题的解决办法 分享
- 无法将函数定义与现有的声明匹配 问题的解决办法 分享
- 郑州iOS點 - 关于升级Mac系统后cocoapods无法导入第三方的问题解决办法
- [转]问题解决:安装ESET NOD32 5无法进入系统及无法激活解决办法
- Broadcom网卡linux系统下无法连接到网络问题的解决办法
- C++ unordered_map自定义KEY用法以及insert无法覆盖解决办法
- [寒江孤叶丶的Cocos2d-x之旅_19]Cocos2d-x 3.0 rc2 版本 Label 的setOpacity 函数失效,无法设置透明度问题的解决办法
- WordPress中修改固定链接导致无法显示文章内容的问题的解决办法
- 原创,禁用userinit.exe,无法进入系统解决办法
- devenv.exe - 系统错误无法启动此程序,因为计算机中丢失 MSVCR100.dll。尝试重新安装该程序以解决此问题。【解决办法】
- Linux64位系统下WTK无法启动的问题解决办法
- DedeCMS系统自定义字段图片类型调用的路径问题解决办法.doc
- devenv.exe - 系统错误无法启动此程序,因为计算机中丢失 MSVCR100.dll。尝试重新安装该程序以解决此问题。【解决办法】
- Sql 2005安装问题,因为WMI配置,无法执行Sql Server 系统配置检查器的解决办法!
- XCode中Categories的类出现无法识别函数的问题的解决办法
- C++问题-无法打开某个自定义源文件
- 关于iOS7之后自定义leftnavigationitem后手势无法响应问题的解决办法