安装Keil537加载程序并编译后 Default Compiler Version 5

本文讲述了在升级到Keil 5.37版本后遇到的'DefaultCompilerVersion5'缺失错误,指导读者如何在ManageProjectItems-Folders/Extensions中添加ARMCC,以确保正确使用ARM-Compiler。过程包括下载ARMCC、安装位置设置和编译器版本确认。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装Keil5.37版本,加载程序,编译时终止,出现错误: 'Default Compiler Version 5' which is not available.

*** Target 'Target 1' uses ARM-Compiler 'Default Compiler Version 5' which is not available.
*** Please review the installed ARM Compiler Versions:
   'Manage Project Items - Folders/Extensions' to manage ARM Compiler Versions.
   'Options for Target - Target' to select an ARM Compiler Version for the target.
*** Rebuild aborted.

要我们对照2个地方,选择配置正确的ARM编译器。

下载ARMCC文件:
链接: https://pan.baidu.com/s/19FytEIZPpfX_JR6dMcB1qA?pwd=de23 提取码: de23 

这里的解决方案是:打开 'Manage Project Items - Folders/Extensions'(魔术棒旁边的三晶体堆),可看到目前只有ARMCLANG,需要额外添加一个ARMCC(提前在网站下载,并放在Keil安装路径的ARM文件夹下)

Product Download Hubhttps://developer.arm.com/downloads/

        添加ARMCC的过程如下:Keil安装路径下的ARM文件夹下

         【确定】后,如下所示:

 【Close】后,ARM-Compiler中多了一项ARMCC。

         【OK】,再去编译程序,就不会报错了。

参考资料:

Kill5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题_小哲要变强的博客-优快云博客Kill5-5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题问题简要描述:昨日更新了keil5软件的版本,从5.17更新到了5.37版本,然后编译STM32项目文件时,软件提示编译报错。报错问题如下:Build started: Project: QKsoftware*** Using Compiler 'V6.18', folder: 'E:\MDK-ARM\ARM\ARM\ARMCLANG\Bin'Build target 'QKsoftware'compilinghttps://blog.youkuaiyun.com/weixin_43644424/article/details/125048889?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165539247416781432914895%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165539247416781432914895&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-125048889-null-null.142%5Ev17%5Epc_search_result_control_group,157%5Ev15%5Enew_3&utm_term=Target+Target1use+ARM-Complier&spm=1018.2226.3001.4187

Build started: Project: STC8H8K64U Build target 'Target 1' linking... *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: BMP MODULE: .\Objects\I2C.obj (I2C) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: HZK MODULE: .\Objects\I2C.obj (I2C) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: ASC2_1608 MODULE: .\Objects\I2C.obj (I2C) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: ASC2_0806 MODULE: .\Objects\I2C.obj (I2C) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: BMP MODULE: .\Objects\OLED_.obj (OLED_) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: HZK MODULE: .\Objects\OLED_.obj (OLED_) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: ASC2_1608 MODULE: .\Objects\OLED_.obj (OLED_) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: ASC2_0806 MODULE: .\Objects\OLED_.obj (OLED_) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: _OLED_POW MODULE: .\Objects\OLED_.obj (OLED_) *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED_SHOWSTRING?OLED *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED_SHOWNUM?OLED *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED_SHOWSIGNEDNUM?OLED *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED_SHOWHEXNUM?OLED *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED_SHOWBINNUM?OLED *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?OLED0_DISPLAY_ON?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?OLED0_DISPLAY_OFF?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_COLORTURN?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_DISPLAYTURN?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_SHOWNUM?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_SHOWSTRING?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_SHOWCHINESE?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OLED0_DRAWBMP?OLED_ *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?OLED0_INIT?OLED_ Program Size: data=89.0 xdata=23688 code=25895 Target not created. Build Time Elapsed: 00:00:01
03-27
<think>嗯,用户遇到了Keil编译STC8H8K64U项目时的L104错误,多个模块重复定义了BMP、HZK等符号。首先,我需要回忆一下L104错误的常见原因。这个错误通常是因为同一个变量或函数在多个地方被定义,导致链接器无法确定使用哪个定义。用户提到的错误出现在I2C.obj和OLED_.obj中,说明这两个模块都包含了这些符号的定义。 接下来,考虑可能的情况。用户可能在头文件中定义了变量,而没有使用extern关键字声明,然后在多个源文件中包含该头文件,导致每个源文件都有一份定义,从而引发重复定义。例如,如果BMP数组在某个头文件中直接定义,并且被I2C.c和OLED_.c包含,就会导致这个问题。 另外,还要注意是否在源文件中重复定义了这些变量或函数。比如,可能不小心在I2C.c和OLED_.c中都写了BMP的初始化代码,而没有使用条件编译或者静态声明。 关于警告L16,未调用的函数段,可能是因为代码中有一些函数未被使用,或者函数名拼写错误导致调用不到。需要用户检查这些函数是否真的需要,或者是否有拼写错误。 解决方案方面,首先应该检查这些符号的定义位置。如果是在头文件中,应该改为使用extern声明,并在一个单独的源文件中定义。如果在多个源文件中定义,需要使用extern或者在其中一个文件中定义为静态。此外,未调用的函数可以考虑删除,或者确认是否有调用但被条件编译屏蔽了。 同时,用户的项目可能涉及多个模块共用字体或图像数据,需要确保这些数据只在一个地方定义,其他地方通过extern引用。另外,检查头文件的包含防护是否做好,避免重复包含导致多次定义。 最后,建议用户检查相关头文件和源文件,使用extern关键字声明变量,在合适的源文件中定义,并确保函数要么被调用,要么被移除。这样应该能解决L104错误,减少警告数量。</think>你遇到的编译错误主要是由符号重复定义和未调用函数引起的,以下是分步解决方案: $\boxed{错误L104分析}$ 1. $\textcolor{blue}{根本原因}$:BMP/HZK/ASC2_1608等符号在多个模块(I2C.obj和OLED_.obj)中被重复定义 2. $\textcolor{red}{常见场景}$: - 头文件中直接定义变量(未用extern声明) - 多个.c文件包含相同变量定义 - 函数实现写在头文件中 $\boxed{解决方案}$ 1. $\textcolor{green}{变量重复定义处理}$: ```c // 错误示例(在.h文件中): unsigned char BMP[] = {0x00,0x01...}; // 直接定义 // 正确做法: // 在.h文件中声明 extern unsigned char BMP[]; // 在单独的.c文件中定义 unsigned char BMP[] = {0x00,0x01...}; ``` 2. $\textcolor{green}{函数重复定义处理}$: ```c // 错误示例(多模块包含相同函数): void OLED_POW() {...} // 在I2C.c和OLED_.c中都有定义 // 正确做法: // 在.h文件中声明 void OLED_POW(void); // 仅在OLED_.c中实现 ``` $\boxed{警告L16分析}$ 1. 编译器检测到OLED_SHOWSTRING、OLED_SHOWNUM等函数未被调用 2. 可能原因: - 确实未使用的冗余代码 - 函数命名错误导致调用失败 - 条件编译未启用相关功能 $\boxed{优化建议}$ 1. 使用$\textcolor{purple}{static}$限定符限制作用域: ```c static void InternalFunction(void) {...} // 仅在本文件可见 ``` 2. 合并字体数据定义到独立模块(如font.c/font.h) 3. 使用条件编译管理不同版本: ```c #ifdef USE_OLED void OLED_ShowString(...) {...} #endif ``` $\boxed{项目结构调整建议}$ ``` Project/ ├── Inc/ │ ├── font.h // 字体extern声明 │ └── oled.h // 函数原型 └── Src/ ├── font.c // 字体数据定义 ├── i2c.c // 仅I2C相关实现 └── oled.c // OLED驱动实现 ``` 最后检查: 1. 所有全局变量在.h中用extern声明 2. 所有函数原型在.h中声明 3. 实际定义仅存在于一个.c文件中 4. 删除未使用的函数减少代码体积 完成上述修改后,重新编译应可消除L104错误,警告L16可根据实际情况选择保留或删除未使用函数。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢奕冰2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值