KEIL消除警告:error in include chain(cmsis_armcc.h):expected identifier or ‘(‘

在移植工程的时候,头文件包含了cortex系列的头文件和cmsis的armcc头文件。

编译过后是0错误0警告的,程序下载运行也是没问题的。但是keil左边有个大叉号,提示头文件错误error in include chain(cmsis_armcc.h):expected identifier or '(' 。

经过逐层寻找发现在cmsis_armcc.h中的静态内联没有定义,但是gotodefine依旧可以跳转,于是把cm0plus.h头文件include一下,好了叉号没有了。。。但是!!编译工程全是警告---方法不可行。

参考博文  点这里,和作者一样我也有强迫症,使用博主的方法成功解决,到Keil的安装目录下的 UV4 文件夹,搜索找到文件夹中的 UVCC.ini 文件,用记事本打开,将报错的那个头文件添加到文件中 (即添加一句 xxxx.h  = *

; specification of errors which are to be ignored for syntax highlighting
; format: ini file, section beginning with '[' is skipped
; module = *		:== ignore all messages associated with this module
; module = line		:== ignore all messages associated with the specified line number in this module
; e.g. abc.h = 275  ; all messages associated with line number 275 in abc.h will be ignored

core_cm0.h      = *
core_cm3.h      = *
core_cm4.h		= *
core_cm0plus.h	= *
core_cm4_simd.h = *
core_cmInstr.h  = *
limits          = *
math.h          = *
string.h        = *
wchar.h         = *
STM32F10x.h     = *
stdio.h         = *
stdarg.h		= *
system_stm32f10x.h = *
cmsis_armcc.h	= *

大体的意思就是哪个头文件报错,就把这个错误忽略掉。。(ignore) 形式就是 moudle = *或者 moudle = line_number

也就是说keil启动的时候会读取这个初始化文件,把所提到的文件全部或者其中几行的错误或警告忽略掉,但是不是代表编译不会报错。

 

 

 

C:\Users\86198\AppData\Local\Arm\Packs\ARM\CMSIS\5.7.0\CMSIS\Core\Include\cmsis_armcc.h(160): error: #247: function "__get_CONTROL" has already been defined __STATIC_INLINE uint32_t __get_CONTROL(void) C:\Users\86198\AppData\Local\Arm\Packs\ARM\CMSIS\5.7.0\CMSIS\Core\Include\cmsis_armcc.h(172): error: #247: function "__set_CONTROL" has already been defined __STATIC_INLINE void __set_CONTROL(uint32_t control) C:\Users\86198\AppData\Local\Arm\Packs\ARM\CMSIS\5.7.0\CMSIS\Core\Include\cmsis_armcc.h(268): error: #247: function "__get_PRIMASK" has already been defined __STATIC_INLINE uint32_t __get_PRIMASK(void) C:\Users\86198\AppData\Local\Arm\Packs\ARM\CMSIS\5.7.0\CMSIS\Core\Include\cmsis_armcc.h(280): error: #247: function "__set_PRIMASK" has already been defined __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) C:\Users\86198\AppData\Local\Arm\Packs\ARM\CMSIS\5.7.0\CMSIS\Core\Include\cmsis_armcc.h(311): error: #247: function "__get_BASEPRI" has already been defined __STATIC_INLINE uint32_t __get_BASEPRI(void) C:\Users\86198\AppData\Local\Arm\Packs\ARM\CMSIS\5.7.0\CMSIS\Core\Include\cmsis_armcc.h(323): error: #247: function "__set_BASEPRI" has already been defined __STATIC_INLINE void __set_BASEPRI(uint32_t basePri) C:\Users\86198\AppData\Local\Arm\Packs\ARM\CMSIS\5.7.0\CMSIS\Core\Include\cmsis_armcc.h(348): error: #247: function "__get_FAULTMASK" has already been defined __STATIC_INLINE uint32_t __get_FAULTMASK(void) C:\Users\86198\AppData\Local\Arm\Packs\ARM\CMSIS\5.7.0\CMSIS\Core\Include\cmsis_armcc.h(360): error: #247: function "__set_FAULTMASK" has already been defined
最新发布
04-03
<think>嗯,用户遇到了CMSIS库中函数重复定义的问题,特别是在使用cmsis_armcc.h时出现了错误#247。我需要仔细分析可能的原因和解决方案。首先,根据用户的描述,问题可能出在头文件的重复包含或者编译器版本不兼容。 首先,用户提到的引用[1]提到更新了cmsis_armcc.h,修正了__ARM_ARCH_6M__宏。这可能意味着旧版本的头文件存在宏定义错误,导致多个头文件重复定义相同函数。因此,检查CMSIS库的版本是否正确,并确保所有相关文件都是最新的,这可能是第一步。 接下来,引用[2]和[3]涉及DSP库的配置和路径设置。用户可能在项目中同时包含了多个库文件,比如不同的DSP版本库,或者在MDK开发环境中路径配置不正确,导致编译器在链接时找到多个相同的函数定义。例如,如果用户手动复制了库文件到lib文件夹,同时又通过ARM PACKS安装了新版本,可能会造成冲突。 另外,ARM PACKS 5.7.0的版本可能存在已知的问题,或者与当前使用的CMSIS版本不兼容。需要确认CMSIS和编译器版本的兼容性,可能需要降级ARM PACKS版本或者升级CMSIS库。 还有,函数重复定义错误通常发生在链接阶段,当同一个函数在多个源文件或库中被定义。用户需要检查项目中的头文件是否有重复包含,或者是否有多个库文件被错误地链接进来。例如,检查是否同时包含了源文件(.c)和库文件(.lib),导致函数被多次编译。 另外,预处理器宏的设置也可能影响头文件的条件编译。例如,不同的宏定义可能导致同一个函数在多个地方被定义。需要检查编译器预定义宏,如__CC_ARM、__ARMCC_VERSION等,确保它们正确配置,避免条件编译错误。 总结可能的解决步骤:更新CMSIS库到最新版本,清理项目并重新配置包含路径,检查库文件的引用是否正确,调整编译器版本或ARM PACKS版本,使用条件编译避免重复包含,以及检查预处理器宏定义。此外,用户可能需要参考官方文档或社区讨论,如GitHub Issue #247,寻找具体的解决方案。</think>### CMSIS库函数重复定义问题解决方案 #### 一、问题定位 函数重复定义通常由以下原因导致: 1. **头文件多次包含**:例如`cmsis_armcc.h`与`cmsis_gcc.h`混合使用或重复引入[^1] 2. **编译器版本冲突**:ARM PACKS 5.7.0可能与旧版CMSIS存在兼容性问题 3. **库文件多重引用**:同时链接了源文件(`.c`)和编译后的库文件(`.lib`) #### 二、具体解决步骤 1. **更新CMSIS库** - 通过ARM PACK Manager升级至最新CMSIS版本(建议5.9.0+) - 验证`cmsis_armcc.h`中宏定义的完整性: ```c #if defined(__CC_ARM) // ARM Compiler特定宏 #define __ASM __asm // 检查函数修饰符定义 #endif ``` 2. **规范项目配置** - 在MDK中检查包含路径: $$ Include\ Paths = C:\Keil_v5\ARM\CMSIS\Include $$ - 确认仅引用单一DSP库版本: ```makefile LIBS = arm_cortexM4lf_math.lib # 引用[2]建议的F4专用库 ``` 3. **优化预处理配置** - 在`Options for Target -> C/C++`添加宏定义: ```ini __FPU_PRESENT=1 // 启用硬件浮点支持 ARM_MATH_CM4 // 明确指定Cortex-M4内核 ``` 4. **检查编译器兼容性** - 确认ARMCC版本与CMSIS的匹配关系: | 编译器版本 | 兼容CMSIS版本 | |------------|---------------| | V5.06 | CMSIS 5.7.x | | V6.14 | CMSIS 5.9.x | #### 三、代码层优化 1. 使用条件编译避免重复包含: ```c #ifndef __CMSIS_ARMCC_H #define __CMSIS_ARMCC_H // 头文件内容 #endif ``` 2. 检查启动文件`startup_stm32f4xx.s`中是否重复定义`SystemInit()`等函数 #### 四、验证方法 1. 生成`map`文件分析符号表: ```plaintext Linking... Program Size: Code=2456 RO-data=320 RW-data=40 ZI-data=1024 ``` 2. 使用`fromelf --text -c -v ./Objects/*.axf > disasm.txt`查看实际链接的库函数
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值