KeilMDK编译错误Error: L6218E: Undefined symbol __aeabi_assert (referred from xxx.o).

本文详细解析了在Keil环境中遇到的__aeabi_assert符号未定义错误的原因,并提供了四种解决方案,包括配置运行时环境、自定义函数实现、禁用assert()或MicroLIB。

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

问题描述:

AirPressure\AirPressure.axf: Error: L6218E: Undefined symbol __aeabi_assert (referred from mbrtu.o).

问题原因:

"Error: L6218E: Undefined symbol __aeabi_assert..." 能够发生是因为“ Project -> Options for Target -> on the Target tab - Use MicroLIB” 被选中。

microlib是一个比ARM标准C库小的独立库。为了节省大小,arm microlib c库不支持或实现几乎所有与操作系统交互的函数,例如abort()、exit()或assert()。

解决办法:

方法一:使用 “Keil::ARM_Compiler Pack

  1. Open the Manage Run-Time Environment dialog and expand Compiler -> I/O

  2. Next to STDERR, check the box . In the variant column, select ITM .
  3. Click OK to close the dialog.

方法二:自己实现__aeabi_assert函数

方法三:禁用  assert()

On Project -> Options For Target -> on the C/C++ tab, for Define type "NDEBUG." - 使 assert() 函数不起作用。

方法四:禁用 MicroLIB

Under Project -> Options For Target -> in the top-right of the Target dialog。

 

<think>好的,用户遇到了链接器错误L6218E,具体是未定义符号Get_Adc_Average。首先,我需要回忆一下这个错误的常见原因。根据之前的引用资料,类似错误通常涉及未链接的库、函数声明与定义不一致,或者编译配置问题。 首先考虑函数是否正确定义。用户可能在某个地方声明了Get_Adc_Average函数(比如在头文件中使用了extern),但没有实际的实现。或者函数名拼写不一致,比如大小写错误,这在C语言中会导致链接器找不到定义。 接下来检查源文件是否包含在项目中。有时候文件可能被创建了但未添加到构建目标里,导致编译时没有参与编译,自然链接时找不到符号。需要让用户确认相关.c文件是否在Keil的项目目录中,并且被正确包含。 然后看链接的库是否正确。如果Get_Adc_Average属于某个外部库,比如STM32的标准外设库或HAL库,用户可能没有在项目设置中添加相应的库文件路径,或者库文件本身未被包含。需要检查库文件的包含情况,确保路径正确,并且必要的库文件被链接。 另外,根据引用资料中的例子,比如错误__aeabi_assert和TIM相关函数未定义,通常是因为MicroLib的配置问题或者缺少启动文件。但这里的问题是关于自定义函数Get_Adc_Average,所以可能更多是用户自己代码的问题,而非库配置。不过,也不能排除启动文件或系统库的问题,特别是如果用户使用了某些依赖MicroLib的特性,但根据引用[2][4],启用或禁用MicroLib可能导致某些符号找不到,但这里的问题更可能和用户代码相关。 还要检查函数声明的参数和返回类型是否与定义一致。例如,如果在头文件中声明了uint16_t Get_Adc_Average(void),但实际定义时参数类型或返回值不匹配,也会导致链接错误。 另外,如果函数是在C++文件中定义的,而用户试图在C代码中调用,没有使用extern "C",可能会导致名称修饰问题,但用户的项目应该是C语言项目,所以这可能不太常见,但如果是混合编程的话需要考虑。 可能还需要查看编译器的输出,确认包含Get_Adc_Average的源文件是否被成功编译,有没有编译错误导致目标文件未生成。如果有编译错误,那链接阶段自然找不到符号。 总结下来,解决步骤应该是: 1. 确认函数Get_Adc_Average是否有正确的定义,并且没有拼写错误。 2. 检查包含该函数定义的源文件是否被添加到项目中,并参与编译。 3. 确保所有相关的头文件正确包含,并且函数声明与定义一致。 4. 如果使用了外部库,确认库路径和文件是否正确链接。 5. 检查编译器的配置,比如MicroLib的设置,但根据错误类型,可能影响的是系统库函数而非用户自定义函数,不过有时候启动文件或系统初始化也可能有关联,需要根据具体情况调整。 用户需要逐步排查这些可能性,特别是前两点,因为自定义函数的未定义通常是由于实现缺失或文件未包含。</think>### 解决链接器错误 L6218E: 未定义符号 `Get_Adc_Average` #### 问题分析 链接错误 `L6218E: Undefined symbol Get_Adc_Average` 表示编译器在链接阶段找不到 `Get_Adc_Average` 函数的实现。可能原因包括: 1. **函数未定义**:未在代码中实现该函数,或实现文件未添加到工程。 2. **声明与定义不匹配**:函数声明(头文件)与定义(源文件)的参数或返回值不一致。 3. **文件未参与编译**:包含函数定义的源文件未被添加到 Keil 工程,或未勾选编译选项。 4. **依赖库未链接**:如果该函数属于某个库(如 STM32 标准外设库),需确保库文件路径正确且已链接[^3][^4]。 --- #### 解决步骤 1. **检查函数定义** - 确认 `Get_Adc_Average` 在某个 `.c` 文件中正确定义,例如: ```c // adc.c uint16_t Get_Adc_Average(void) { // 具体实现 return adc_value; } ``` - 检查函数名拼写是否与调用处完全一致(包括大小写)。 2. **验证源文件包含** - 在 Keil 工程中,右键点击目标文件夹 → **Add Existing Files**,确保包含 `Get_Adc_Average` 的 `.c` 文件(如 `adc.c`)已添加到工程。 - 右键该文件 → **Options for File** → 确认勾选 **Include in Target Build**(见图1)。 3. **检查头文件声明** - 在调用 `Get_Adc_Average` 的代码文件中,确认已包含声明该函数的头文件(如 `adc.h`): ```c // adc.h #ifndef ADC_H #define ADC_H uint16_t Get_Adc_Average(void); #endif ``` - 确保声明与定义的返回类型和参数完全一致。 4. **验证库链接(如适用)** - 如果 `Get_Adc_Average` 属于外部库(如 STM32 HAL 库): - 打开 **Project → Options for Target → C/C++**,检查 **Include Paths** 是否包含库头文件路径。 - 在 **Linker** 选项卡中,确认相关库文件(如 `STM32xxx_LL_ADC.a`)已添加。 5. **调整 MicroLib 配置** - 根据引用[2][4],某些情况下需禁用 MicroLib: - 打开 **Project → Options for Target → Target** → 取消勾选 **Use MicroLIB** → 重新编译。 --- #### 示例配置 1. **添加源文件到工程** ![图1:Keil 文件包含配置](https://example.com/keil_add_file.png) *若文件未添加,链接器无法找到符号。* 2. **检查函数定义与声明一致性** ```c // 正确示例 uint16_t Get_Adc_Average(void); // 声明 uint16_t Get_Adc_Average(void) { // 定义 // 代码 } ``` --- #### 拓展建议 - 若问题仍存在,检查编译日志中是否生成 `adc.o` 文件。若无,说明 `adc.c` 未编译。 - 使用 **Build Output** 窗口定位具体缺失符号的调用位置。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值