W806 SDK 支持 C++ 编译步骤

发布于 2022-08-22 23: 32: 50

使得 W806 SDK 支持 C++ 编译

  • 打开 gcc_csky. ld 文件, 添加如下内容, 为防止大家写错, 我直接写出来, 大家粘复制就可以了

image-20220823113124971

  * (. rodata. str1. 4) 
  __ctor_start__ = . ; 
  KEEP  (*crtbegin. o (. ctors) ) 
  KEEP  (*crtbegin? . o (. ctors) ) 
  KEEP  (* (EXCLUDE_FILE  (*crtend. o *crtend? . o )  . ctors) ) 
  KEEP  (* (SORT (. ctors. *) ) ) 
  KEEP  (* (. ctors) ) 
  __ctor_end__ = . ; 
  KEEP  (*crtbegin. o (. dtors) ) 
  KEEP  (*crtbegin? . o (. dtors) ) 
  KEEP  (* (EXCLUDE_FILE  (*crtend. o *crtend? . o )  . dtors) ) 
  KEEP  (* (SORT (. dtors. *) ) ) 
  KEEP  (* (. dtors) ) 
      __dtor_end__ = . ; 
  .  = ALIGN (0x4)  ; 
  __erodata = . ; 
  • 找到 system. c 文件, 在该文件中添加如下 函数接口, 目的为了初始化 C++ 构造函数构造空间

    extern int __dtor_end__; 
    extern int __ctor_end__; 
    extern int __ctor_start__; 
    typedef void  (*func_ptr)  (void) ; 
    __attribute__ ( (weak) )  void cxx_system_init (void) 
    {
        func_ptr *p; 
        for  (p =  (func_ptr *) &__ctor_end__ -1;  p  =  (func_ptr *) &__ctor_start__;  p--) 
        {
             (*p)  () ; 
        }
    }
  • 在 SystemInit 函数中调用该函数即可, 如下图所示

image-20220822234317270

  • 以上步骤都做好后, 理论上就可以尽情的使用 C++ 进行编写了, 但是官方 SDK 并没有做 C++ 的支持, 因此在包含官方驱动头文件的时候, 需要你手动加上 C++ 的判断.

    #ifdef __cplusplus
    extern "C" {
    #endif
    /* 头文件中原本内容*/
    
    #ifdef __cplusplus
    }
    #endif
  • 以 wm_hal. h 为例子, 在头文件的开始和结尾加入如下图所示内容即可

    image-20220822232949674

    image-20220822233521940

0 条评论

发布
问题