RT-Thread论坛
直播中

张生

10年用户 929经验值
擅长:光电显示 接口/总线/驱动
私信 关注
[问答]

使用CubeMX移植nano编译时出现大量报错,怎么解决?

编译时出现大量报错。报错集中在core/src/syscalls.c以及sysmem.c文件中。

报错内容如下所示,主要是提示找不到errno.h中的相关声明。

但是errno.h使用f12可以打开,也能正常访问到,但是编译时候就是会报错;

../Core/Src/syscalls.c: In function '_execve':
../Core/Src/syscalls.c:174:3: error: 'errno' undeclared (first use in this function)
  174 |   errno = ENOMEM;
      |   ^~~~~
../Core/Src/syscalls.c:174:3: note: 'errno' is defined in header ''; did you forget to '#include '?
../Core/Src/syscalls.c:174:11: error: 'ENOMEM' undeclared (first use in this function)
  174 |   errno = ENOMEM;
      |           ^~~~~~
make: *** [Core/Src/subdir.mk:43: Core/Src/syscalls.o] Error 1
"make -j12 all" terminated with exit code 2. Build might be incomplete.

回帖(1)

李斌

2025-4-2 18:15:41

在移植CubeMX并遇到syscalls.csysmem.cerrno未声明的编译错误时,可以按照以下步骤解决:


步骤1:检查头文件包含




  1. 在报错文件中添加#include

    打开syscalls.csysmem.c,确保文件开头已包含errno.h。如果未包含,手动添加:


    #include 



  2. 确认标准库路径正确

    检查CubeMX项目配置中的Include Paths,确保编译器能找到标准库头文件(如errno.h)。通常路径类似:  


    /arm-none-eabi/include





步骤2:调整编译器/链接器配置




  1. 启用完整标准库支持

    在CubeMX的Project Settings中,检查是否使用了newlib-nano(默认可能启用)。尝试关闭Use newlib-nano选项:  



    • 进入 Project ManagerAdvanced Settings  

    • Linker Settings中的Use newlib-nano设置为No(如果存在该选项)。




  2. 添加必要的编译宏

    在编译选项中定义宏_AEABI_PORTABILITY_LEVEL=1,以启用兼容模式:  



    • 进入 Project ManagerC/C++ BuildSettingsTool SettingsC CompilerPreprocessor  

    • Defines中添加:  
      _AEABI_PORTABILITY_LEVEL=1




  3. 调整链接器参数

    在链接器选项中添加--specs=rdimon.specs--specs=nosys.specs,确保系统调用实现正确:  



    • 进入 Project ManagerC/C++ BuildSettingsTool SettingsLinkerMiscellaneous  

    • Linker flags中添加:  
      --specs=rdimon.specs

      或(根据需求选择):


      --specs=nosys.specs






步骤3:检查标准库实现




  1. 覆盖系统调用函数

    如果使用newlibnewlib-nano,需要确保系统调用函数(如_write_read等)被正确实现。检查syscalls.c中是否缺少必要函数,或是否与库实现冲突。




  2. 手动声明errno(临时方案)

    syscalls.c中添加extern声明(不推荐长期使用,但可用于测试):  


    extern int errno;





步骤4:重新生成代码并清理项目




  1. 通过CubeMX重新生成代码

    删除现有项目中的Core/SrcCore/Inc目录,重新生成代码,避免旧文件残留导致冲突。




  2. 清理并重新编译

    执行项目清理(ProjectClean),然后重新编译。






步骤5:验证工具链和CubeMX版本




  1. 更新工具链和CubeMX

    确保使用的ARM工具链(如GCC)和CubeMX为最新版本,避免已知的兼容性问题。




  2. 检查社区解决方案

    搜索类似错误(如“CubeMX newlib errno undeclared”),参考ARM开发者论坛或Stack Overflow的解决方案。






总结


大多数情况下,问题是由于newlib-nano的配置不完整或缺少宏定义导致。通过调整标准库选项、添加必要的宏定义和链接器参数,即可解决errno未声明的错误。如果问题依旧,建议检查系统调用实现或切换为完整版newlib

举报

更多回帖

发帖
×
20
完善资料,
赚取积分