Error: L6218E: Undefined symbol rt_thread_create (referred from thread_sample.o).

Error: L6218E: Undefined symbol rt_thread_create (referred from thread_sample.o).

问题描述

keil5移植RTThread-nano编译报错

解决方法

在Middlewares/RT-Thread/RTOS/kernel文件下board.c->rtconfig.h文件中打开注释的//#define RT_USING_HEAP

在这里插入图片描述

修改后编译成功


个人理解:打开//#define RT_USING_HEAP是运用RT-Thread裁剪后自带的动态内存堆,默认使用RT-Thread的动态内存,如果使用keil的动态内存需要考虑线程间的同步问题。

声明:本文章纯属于学习过程遇到的问题以及上网查询并总结所得结果,如有侵权请联系删除。


### 关于 L6218E 错误:未定义符号 `__aeabi_assert` 当编译器报告链接器错误 **L6218E: Undefined Symbol __aeabi_assert** 时,这通常意味着程序中调用了函数 `__aeabi_assert`,但在链接阶段未能找到该函数的实际实现。以下是可能的原因及其解决方案: #### 原因分析 1. 缺少必要的库文件 函数 `__aeabi_assert` 是 ARM EABI (Embedded Application Binary Interface) 的一部分,用于处理断言失败的情况。如果项目缺少标准 C 库或其相关支持文件,则可能会发生此问题[^1]。 2. 配置不正确 如果项目的链接配置中遗漏了某些必需的选项或者路径设置有误,也可能导致无法解析此类符号[^2]。 3. 自定义构建环境中的缺失项 在一些自定义工具链下,开发者可能手动裁剪掉了部分功能模块(比如调试相关的宏),从而间接移除了对这些辅助方法的支持[^3]。 #### 解决方案 ##### 方法一:确认并添加正确的运行时库 确保在您的工程设置里包含了完整的C/C++ runtime libraries。对于基于ARM架构的目标平台来说,应该核查是否有引入像`libgcc.a`, 或者更具体的针对异常处理和支持assert机制的相关档案文件[^4]。 ```bash -lm -lc -lgcc ``` 上述命令片段展示了如何通过GCC指定附加的标准数学(-lm),核心C语言特性(-lc)以及GNU Compiler Collection内部使用的特定组件(-lgcc)[^5]。 ##### 方法二:重新审视源码逻辑 检查是否存在显式或隐式的调用到`__aeabi_assert()`的地方。一般情况下,除非特别定制化修改过assert行为,默认是不会直接看到这个名称被引用的;它更多是由其他高层级API触发而来。因此可以考虑搜索整个项目范围内关于“assert”的关键词实例,并评估它们是否合理且必要存在于此上下文中[^6]。 另外一种可能性是由于第三方依赖关系带入了这种需求——即某个外部DLL/静态LIB本身期望使用者提供全套的基础服务包来满足自身的运作条件。此时需仔细阅读对应文档说明了解确切的要求清单[^7]。 ##### 方法三:强制屏蔽不必要的断言语句 假如确定当前开发周期内不需要任何形式的runtime assertion checkings, 可尝试预处理器指令禁用所有关联操作: ```c #define NDEBUG #include <assert.h> ``` 这样做的效果是在编译期就消除了所有的assert macro展开动作,进而规避掉潜在的undefined reference隐患[^8]。 请注意这种方法虽然简单粗暴有效,但从长远看并不推荐作为最终修复策略,因为它实际上掩盖了原本设计意图而非真正解决问题根源所在。 --- ### 提供一段示范代码调整例子 假设我们遇到如下场景: ```c void example_function(int value){ assert(value !=0 && "Value must not be zero"); } ``` 如果我们怀疑正是这里的assert引起了后续麻烦,那么可以根据实际情况采取下面两种方式之一进行改造: 要么彻底删除验证环节(仅适用于非常明确知晓输入数据始终安全的前提下): ```c void example_function(int value){ // Removed the assert statement. } ``` 要么替换为更加轻量级的手动检测手段而不借助standard library的帮助 : ```c void example_function(int value){ if (!value){ printf("Error: Value is unexpectedly ZERO.\n"); exit(EXIT_FAILURE); } } ``` 以上改动均能帮助绕开原始报错点的同时维持基本的功能一致性[^9]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值