编译SeggerRTT报错: warning: #47-D: incompatible redefinition of macro "SEGGER_RTT_LOCK"

近期新建工程加入了 Segger RTT源码编译,发现什么都没做却报错了,具体错误代码如下所示:

.....

warning:  #47-D: incompatible redefinition of macro "SEGGER_RTT_LOCK"  (declared at line 199)

warning:  #47-D: incompatible redefinition of macro "SEGGER_RTT_UNLOCK"  (declared at line 200)

......

 

始终找不到错误原因,然后对比原来的工程发现新工程中勾选了GNU extensions选项。然后去掉该选项就可以成功编译。

分析原因: 因为新工程勾选了这个 GUN 拓展的特性,所以环境会自带宏定义 __GUNC__ 表示, 也就是说在当前环境中既有MDK的__CC_ARM, 也有GCC的__GUNC__ , 所以造成在  SEGGER_RTT_Conf.h 文件中的下面代码中的 SEGGER_RTT_LOCK 和 SEGGER_RTT_UNLOCK 会重复宏定义,如下:

/*********************************************************************
*
*       RTT lock configuration for SEGGER Embedded Studio,
*       Rowley CrossStudio and GCC
*/
#if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)
  #ifdef __ARM_ARCH_6M__
    #define SEGGER_RTT_LOCK()   {                                                                   \
  //省略 ..................  \

    #define SEGGER_RTT_UNLOCK()   __asm volatile ("msr   primask, %0  \n\t"                         \
  //省略....................                                            \
                                }

/*********************************************************************
*
*       RTT lock configuration for KEIL ARM
*/
#ifdef __CC_ARM
  #if (defined __TARGET_ARCH_6S_M)
    #define SEGGER_RTT_LOCK()   {                                                \
  //省略....................                                            \

    #define SEGGER_RTT_UNLOCK()   PRIMASK = LockState;                           \
  //省略....................                                            \                                         \
                                }
                      \
  //省略....................                                            \
  #endif
#endif

解决办法是在 GCC 的条件编译项目外加约束条件,如下:

/*********************************************************************
*
*       RTT lock configuration for SEGGER Embedded Studio,
*       Rowley CrossStudio and GCC
*/
#if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || ((defined __GNUC__)&&!(defined(__CC_ARM)))


.....................................

即将 (defined __GNUC__) 修改为 ((defined __GNUC__)&&!(defined(__CC_ARM))) 。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值