eCos系统无法正确链接到在C++源文件中自定义的cyg_user_start函数的问题和解决办法

在C++源文件中定义cyg_user_start函数前,将其声明成C函数,即可解决问题。
 

eCos官网: http://ecos.sourceware.org
eCos中文技术网: http://www.52ecos.net
eCos交流QQ群:144940146。
http://blog.csdn.net/zoomdy/article/details/39396085
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函数的函数进行名称转换,void cyg_user_start(void)的最终符号名依然为cyg_user_start。使用nm查看生成的.o文件可以查看符号表,通过查看符号表可以发现这个问题。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值