stm32 编译Error: L6218E: Undefined symbol Led_Turn_on_1 (referred from module.o)

本文解决在使用Keil编译器时遇到的函数名不匹配导致的编译错误问题。主要原因是函数名称在对应的.c文件中与之前定义的不一致。建议将通用宏搜索文件加入工程,或者直接注释掉未使用的函数定义来解决问题。
AI助手已提取文章相关产品:

FPLOCK_V1.axf: Error: L6218E: Undefined symbol Led_Turn_on_1 (referred from module.o)

 

一  我的原因是在module.c文件里写了含有Led_Turn_on_1的函数,之前也没定义,其实这段没用,让我注释掉后就好了。

 

后来我又遇见过几次类似的情况,总结起来都是在对应的.c文件里调用的函数与你之前定义过的函数名不符。

 

二 有很多人说  在keil里搜cortexm3_macro.s,复制到自己的工程文件下,加入编译即可。据说有用。请试试。

 

 

您可能感兴趣的与本文相关内容

ibs.a\(*.o\) ./../../..//libs/suniv/elibs_ex.a ./../../..//libs/suniv/app_views.a Warning: L6310W: Unable to find ARM libraries. Error: L6218E: Undefined symbol __aeabi_ddiv (referred from app_root.o). Error: L6218E: Undefined symbol __aeabi_i2d (referred from app_root.o). Error: L6218E: Undefined symbol __aeabi_memcpy4 (referred from app_root.o). Error: L6218E: Undefined symbol __aeabi_memclr4 (referred from app_root.o). Error: L6218E: Undefined symbol __aeabi_uidivmod (referred from com_video_in.o). Error: L6218E: Undefined symbol __aeabi_idivmod (referred from video_linklist_manager.o). Error: L6218E: Undefined symbol __aeabi_memcpy (referred from dv_frm.o). Error: L6218E: Undefined symbol sprintf (referred from fmtop_frmwin.o). Error: L6218E: Undefined symbol __aeabi_uldivmod (referred from record_view_doc.o). Error: L6218E: Undefined symbol memcmp (referred from GetAudio_format.o). Error: L6218E: Undefined symbol __aeabi_dmul (referred from OAL.o). Error: L6218E: Undefined symbol __aeabi_dadd (referred from OAL.o). Error: L6218E: Undefined symbol __aeabi_d2iz (referred from OAL.o). Error: L6218E: Undefined symbol _dfixu (referred from OAL.o). Error: L6218E: Undefined symbol __aeabi_drsub (referred from OAL.o). Error: L6218E: Undefined symbol __aeabi_ui2d (referred from OAL.o). Error: L6218E: Undefined symbol __aeabi_cdcmple (referred from OAL.o). Error: L6218E: Undefined symbol __aeabi_f2iz (referred from AudioInfo_AAC.o). Error: L6218E: Undefined symbol __aeabi_fdiv (referred from AudioInfo_AAC.o). Error: L6218E: Undefined symbol __aeabi_fmul (referred from AudioInfo_AAC.o). Error: L6218E: Undefined symbol __aeabi_l2f (referred from AudioInfo_AAC.o). Error: L6218E: Undefined symbol __aeabi_ui2f (referred from AudioInfo_AAC.o). Error: L6218E: Undefined symbol __ARM_scalbnf (referred from AudioInfo_AAC.o). Error: L6218E: Undefined symbol __aeabi_i2f (referred from AudioInfo_AAC.o). Error: L6218E: Undefined symbol __aeabi_f2uiz (referred from AudioInfo_ATRAC.o).
最新发布
09-24
<think> 我们在处理ARM编译错误时,需要关注链接器无法找到标准库函数的问题。用户遇到了两类错误: 1. L6310W: 无法找到ARM库(警告) 2. L6218E: 未定义符号(错误),包括__aeabi_ddiv、sprintf等 这些错误通常与链接器配置有关,可能是缺少必要的库文件或链接顺序问题。 ### 解决步骤: #### 1. **检查工具链配置** - 确保使用的ARM编译工具链(如ARMCC, ARM-GCC)路径正确配置在开发环境中。 - 验证环境变量(如`PATH`)是否包含工具链的`bin`目录。 #### 2. **确认库路径设置** - 链接器需要知道标准库的位置。在IDE(如Keil MDK)中,检查: - **Target Options** -> **Target** 选项卡:确认是否正确选择了设备(Device),因为设备选择会决定使用的标准库。 - **Target Options** -> **Output** 选项卡:确保“Create Library”未被选中。 - **Target Options** -> **Listing** 选项卡:检查交叉引用和符号表生成设置。 - **Target Options** -> **C/C++** 选项卡:确保优化级别不是禁用链接(比如-O0通常安全)。 - 若使用命令行编译,检查链接命令中是否包含库路径(如`-L`选项)和库文件(如`-lm`)。 #### 3. **添加必要的库文件** - 未定义符号如`__aeabi_ddiv`(双精度浮点除法)属于ARM运行时库(如`libarm_cortexM4lf_math.a`,具体名称取决于设备和浮点支持)。 - `sprintf`等标准C函数通常由标准C库(如`libc.a`)提供。 - **解决方法**: - **在Keil MDK中**: 1. 打开**Manage Run-Time Environment**(RTE)。 2. 勾选`CMSIS`下的`CORE`和`Device`下的`Startup`(根据设备)。 3. 勾选`Compiler`下的`IO STDOUT`和`IO STDIN`(若使用了`printf`/`scanf`系列函数)。 4. 若使用了数学函数(如浮点运算),勾选`Compiler`下的`Math Library`(如`IEEE-754`)。 - **在命令行中**: 1. 明确链接数学库:添加`-lm`。 2. 添加标准库:通常通过`-lc`指定,但ARM工具链可能自动包含。若未包含,需手动添加路径(如`-L <path_to_libs>`)和库名。 3. 针对浮点支持:根据目标处理器(如Cortex-M4F)添加对应的库(如`--library_type=microlib`或标准库)。 #### 4. **处理微库(MicroLib)与标准库冲突** - **问题**:若项目配置为使用微库(占用空间小),但代码依赖标准库函数(如浮点运算),则会出现未定义符号错误。 - **解决方法**: - **Keil MDK**:在**Target Options** -> **Target** 选项卡中,检查`Use MicroLIB`是否被勾选。如果代码需要完整的标准库支持,请**取消勾选**微库(反之则勾选)。 - 注意:微库不支持所有ANSI C功能(如文件I/O、部分浮点运算),若代码需完整支持,应使用标准库。 #### 5. **检查代码中的浮点运算** - 若出现`__aeabi_ddiv`等浮点相关错误,确认代码是否使用了双精度浮点运算(double)。在Cortex-M设备上,双精度运算通常由软件模拟(因此需要链接数学库),速度较慢。 - **优化建议**:考虑使用单精度(float)替代双精度(double),以减少对软浮点库的依赖。单精度运算在带FPU的Cortex-M4/M7上可硬件加速。 - **强制单精度**:在编译选项中添加`-fsingle-precision-constant`(GCC)或`--fpmode=fast`(ARMCC)以减少双精度的使用。 #### 6. **重新构建工程** - 执行**Clean**操作(删除所有中间文件和输出文件),然后重新编译链接。 ### 示例:Keil MDK 配置调整 1. 打开目标选项(右键Target -> Options for Target)。 2. 在**Target**选项卡: - 确认设备选择正确。 - 若使用了FPU(浮点单元),在`Floating Point Hardware`中选择`Single Precision`(Cortex-M4)或`Double Precision`(Cortex-M7)。 - 检查`Use MicroLIB`:若未使用FPU且需要小体积,可启用;否则禁用。 3. 在**C/C++** 选项卡: - 若启用FPU,添加预定义宏`__FPU_PRESENT=1`和`__FPU_USED=1`(通常设备头文件已定义,但需确认)。 4. 在**Linker**选项卡: - 确保未勾选`Use Memory Layout from Target Dialog`以外的特殊选项。 - 检查`Scatter File`是否配置正确(通常自动生成即可)。 5. 打开**Manage Run-Time Environment**: - 勾选`Device` -> `Startup`(包含启动代码和基本库)。 - 勾选`Compiler` -> `IO:STDOUT`(启用`printf`支持)。 - 勾选`Compiler` -> `Math Library`(如`IEEE-754:FPv4-SP-D16 for Cortex-M4`)。 ### 命令行编译示例(ARM-GCC) 链接命令需包含: ```bash arm-none-eabi-gcc ... -L "<toolchain_path>/lib/thumb/v7e-m+fp/hard" \ -lc -lm -lnosys -T <linker_script.ld> -o output.elf ``` 其中: - `-L`:指定库搜索路径(根据目标架构选择)。 - `-lc`:链接标准C库。 - `-lm`:链接数学库。 - `-lnosys`:链接用于系统调用的桩库(若使用`syscalls`)。 ### 总结 1. 确保工具链和设备配置正确。 2. 链接合适的运行时库(标准库或微库)和数学库。 3. 若使用浮点,确认硬件支持(FPU)并配置编译选项。 4. 清理并重建工程。 §§相关问题§§ 1. 如何确认Keil MDK中的设备配置是否正确? 2. ARM-GCC中如何指定库路径以解决链接错误? 3. 微库(MicroLib)与标准库的主要区别是什么?如何选择? 4. 在Cortex-M设备上如何优化浮点运算性能? 5. 如何解决Keil中的"Undefined symbol __aeabi_assert"错误? </think> ### 解决编译错误 L6310W 和 L6218E 的步骤 这些错误通常与 ARM 工具链的库配置相关,以下是系统性的解决方案: #### 1. **检查基础库配置** - **添加标准库依赖**: 在链接器设置中添加 `libc.a` 和 `libm.a`(标准 C 库和数学库): ```makefile LDLIBS = -lc -lm ``` 对于 Keil MDK:**Project Options > Linker > Misc Controls** 添加 `--library_type=standardlib`[^1] - **启用微库支持**(适用于资源受限设备): 在编译器选项中添加: ```makefile CFLAGS += --library_type=microlib ``` #### 2. **解决未定义符号错误** - **浮点运算符号(如 `__aeabi_ddiv`)**: 添加数学库链接并检查浮点设置: ```makefile LDLIBS += -lm ``` 在 Keil 中:**Target Options > Target** 确保 `Floating Point Hardware` 设置正确(如硬件 FPU 选 `Single Precision`) - **标准函数(如 `sprintf`)**: 显式链接 `libc.a` 并检查函数声明: ```c #include <stdio.h> // 确认头文件包含 ``` #### 3. **验证库路径** - 在工具链设置中确认 ARM 库路径(如 `ARM\ARMCC\lib`)已包含: ```makefile LIBRARY_PATH = /path/to/ARM/libs ``` 对于 Keil:**Project Options > Linker > Config** 检查 `Use Memory Layout from Target Dialog` #### 4. **启动文件配置** - 确保启动文件(如 `startup_ARMCM4.s`)正确链接: ```makefile OBJS += startup_ARMCM4.o # 添加到目标文件列表 ``` - 在启动文件中检查堆栈初始化符号(如 `__initial_sp`) #### 5. **其他关键检查** - **编译器一致性**:所有文件使用相同工具链版本编译 - **符号声明**:检查头文件是否遗漏函数原型 - **优化冲突**:临时关闭 LTO(链路优化)测试 ### 典型配置示例 (Keil MDK) 1. **Target Options > Target**: - ✅ 勾选 `Use MicroLIB`(资源受限设备) - ❌ 禁用 `Use Memory Layout from Target Dialog` 2. **Linker > Misc Controls**: ``` --strict --scatter=scatter_file.sct ``` 3. **重新构建流程**: ```bash make clean # 清理旧对象文件 make all # 完整重建 ``` > 注意:若使用硬件 FPU,需在代码中添加 `#define __FPU_PRESENT 1` 并启用编译选项 `-mfpu=fpv4-sp-d16`[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值