近期新建工程加入了 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))) 。