编译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选项。然后去掉该选项就可以成功编译。

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

分析原因: 因为新工程勾选了这个 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))) 。

你可能感兴趣的:(STM32)