zoukankan      html  css  js  c++  java
  • 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文件能够查看符号表。通过查看符号表能够发现这个问题。

  • 相关阅读:
    unity IOC 的使用
    Senparc之OAuth原理
    改进的日志记录类
    发一个 Nuget打包发布小工具
    贴一个微信小程序跳一跳辅助
    调用API让声卡发出声音
    控制台彩色输出
    C#调用cmd实现自我删除
    一个适合新手的简易计算器
    简单Console进度条
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6753121.html
Copyright © 2011-2022 走看看