关于keil5编译报错问题的解决(使用use default complier version 6)

1.问题来源

作为一名新手,我们在观看b站江协科技的教程时,因为下载的keil5版本与教程不一样,在编译时会发生

Build started: Project: project1.1
*** Using Compiler 'V6.21', folder: 'F:\32\ARM\ARMCLANG\Bin'
Build target 'Target 1'
start/core_cm3.c(445): error: non-ASM statement in naked function is not supported
  445 |   uint32_t result=0;
      |   ^
start/core_cm3.c(442): note: attribute is here
  442 | uint32_t __get_PSP(void) __attribute__( ( naked ) );
      |                                           ^
start/core_cm3.c(465): error: parameter references not allowed in naked functions
  465 |                   "BX  lr     \n\t" : : "r" (topOfProcStack) );
      |                                              ^
start/core_cm3.c(461): note: attribute is here
  461 | void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) );
      |                                                          ^
start/core_cm3.c(479): error: non-ASM statement in naked function is not supported
  479 |   uint32_t result=0;
      |   ^
start/core_cm3.c(476): note: attribute is here
  476 | uint32_t __get_MSP(void) __attribute__( ( naked ) );
      |                                           ^
start/core_cm3.c(499): error: parameter references not allowed in naked functions
  499 |                   "BX  lr     \n\t" : : "r" (topOfMainStack) );
      |                                              ^
start/core_cm3.c(495): note: attribute is here
  495 | void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) );
      |                                                          ^
4 errors generated.
compiling core_cm3.c...
compiling system_stm32f10x.c...
".\Objects\project1.1" - 4 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:01

这样的问题,问题的原因是版本问题。

2.问题解决

2.1下载Compiler Version 5编译器

ARMCompiler_506_Windows_x86_b960.7z_免费高速下载|百度网盘-分享无限制

2.2 将文件的ARMCC文件复制/剪切到keil5项目的ARM文件夹下

注意:此步骤特别重要,不然识别不到路径

2.3打开此

2.4点击 Add another ARM Compiler Version to List...

2.5、选择V5编译器的安装路径ARMCC,点击确定

2.6 点击close

2.7最后在点击 “魔术棒”图标,进入Target页面,可以看到ARM Compiler的选择中多了Version 5,选择use default complier version 5),点击ok

3.大功告成

谢谢观看,希望鼓励点赞~~

<think>嗯,用户遇到了Keil编译时的L6200E错误,符号ASCII_Table被重复定义了。我需要先理解这个问题产生的原因。根据之前的引用资料,类似的问题都是因为同一个符号在多个源文件中被定义了,导致链接器不知道用哪个。比如引用[1]中提到的RTC_Init被两个不同的对象文件定义,引用[2]中的EXTI9_5_IRQHandler重复定义,解决方法都是确保符号只定义一次。 那ASCII_Table这个符号可能是在头文件里被多个源文件包含,导致每个包含该头文件的源文件都有一个定义。或者是在多个.c文件中都定义了该变量,而没有使用extern声明。比如引用[3]中的__stdout和__stderr的问题,通过在usart.c中添加定义解决,可能用户需要检查ASCII_Table的定义位置。 正确的做法应该是将变量在头文件中用extern声明,然后在某一个.c文件中进行实际的定义。比如,在头文件里写extern const char ASCII_Table[];,然后在bsp_lcd.c或者main.c其中一个文件中定义const char ASCII_Table[] = { ... };。这样其他文件包含头文件时,看到的是extern声明,不会重复定义。 另外,用户提到错误出现在bsp_lcd.o和main.o中,说明这两个文件都包含了ASCII_Table的定义。需要检查这两个文件的源代码,看是否有重复定义的情况。如果是头文件中直接定义而没有使用extern,那么每个包含该头文件的.c文件都会生成一个定义,导致冲突。这时候应该修改头文件,使用extern声明,并在一个地方定义。 还有一种可能是用户不小心在头文件中使用了初始化,比如直接写了char ASCII_Table[] = {...};,这样每个包含该头文件的源文件都会有一个定义。应该改为在头文件中声明,在.c文件中定义。 另外,检查是否在多个.c文件中都定义了ASCII_Table,比如可能在bsp_lcd.c和main.c中都写了char ASCII_Table[] = {...};,这时候需要删除其中一个,只保留一个定义,并用extern在头文件中声明。 总结解决方法:确保ASCII_Table只在单个源文件中定义一次,其他文件通过extern引用。同时检查头文件是否包含正确的声明,避免多次定义。</think>### 解决L6200E: Symbol ASCII_Table重复定义问题 #### 问题原因 链接错误`L6200E`表明符号`ASCII_Table`在多个目标文件(如`bsp_lcd.o`和`main.o`)中被重复定义[^1][^2]。常见原因如下: 1. **头文件中直接定义变量**:若`ASCII_Table`在头文件中未经`extern`声明直接初始化,多个包含该头文件的源文件会各自生成独立定义。 2. **多个源文件重复定义**:在`bsp_lcd.c`和`main.c`中均包含`ASCII_Table`的显式定义(如`char ASCII_Table[] = {...};`)。 --- #### 解决方法 **步骤1:检查符号定义位置** - 若`ASCII_Table`在头文件中定义,需修改为**声明**而非定义: ```c // 头文件(如 lcd.h) extern const char ASCII_Table[]; // 声明为外部变量 ``` - 在**单一源文件**(如`bsp_lcd.c`)中完成实际定义: ```c // 源文件(如 bsp_lcd.c) const char ASCII_Table[] = {0x00, 0x01, ...}; // 实际初始化 ``` **步骤2:避免多重初始化** - 确保所有引用`ASCII_Table`的源文件仅通过`#include "lcd.h"`调用,且未重复定义[^3]。 **步骤3:检查文件包含关系** - 删除`main.c`或其他文件中可能存在的`ASCII_Table`定义,保留唯一一处初始化。 **步骤4:使用`static`限定符(可选)** - 若需在多个文件中使用独立副本(不推荐共享数据场景),可声明为`static`: ```c // 各源文件中单独定义 static const char ASCII_Table[] = {...}; ``` --- #### 示例代码结构 ```c // lcd.h #ifndef LCD_H #define LCD_H extern const char ASCII_Table[]; // 外部声明 #endif // bsp_lcd.c #include "lcd.h" const char ASCII_Table[] = {0x30, 0x31, ...}; // 实际定义 // main.c #include "lcd.h" void main() { printf("%c", ASCII_Table[0]); // 正确引用 } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值