天天看點

編譯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 "SEGGER_RTT_LOCK"

分析原因: 因為新工程勾選了這個 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))) 。

繼續閱讀