You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

brew安装的arm-none-eabi-gcc编译ARM嵌入式程序无法找到标准头文件

问题描述

测试代码

#include <string.h>
#include <stdio.h>

int main() {
  printf("hello world\n");
  return 0;
}

编译结果对比

使用brew安装的arm-none-eabi-gcc编译

> arm-none-eabi-gcc test.c
test.c:1:10: fatal error: string.h: No such file or directory
    1 | #include <string.h>
      |          ^~~~~~~~~~
compilation terminated.

使用ARM官方工具链编译(预期链接错误)

> /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/arm-none-eabi-gcc test.c
/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-exit.o): in function `exit':
exit.c:(.text.exit+0x28): undefined reference to `_exit'
/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-closer.o): in function `_close_r':
closer.c:(.text._close_r+0x18): undefined reference to `_close'
/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-fstatr.o): in function `_fstat_r':
fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'
/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-isattyr.o): in function `_isatty_r':
isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'
/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-lseekr.o): in function `_lseek_r':
lseekr.c:(.text._lseek_r+0x24): undefined reference to `_lseek'
/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-readr.o): in function `_read_r':
readr.c:(.text._read_r+0x24): undefined reference to `_read'
/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-sbrkr.o): in function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'
/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/libc.a(libc_a-writer.o): in function `_write_r':
writer.c:(.text._write_r+0x24): undefined reference to `_write'
collect2: error: ld returned 1 exit status

用户疑问

为何brew安装的编译器无法找到标准头文件?怀疑该问题与工具链的标准库实现有关,但对这块细节不甚了解。


问题分析与解决

brew提供的arm-none-eabi-gcc默认是精简版工具链,没有预装嵌入式目标所需的标准C库(如newlib)及其头文件,这是导致找不到string.h等标准头文件的核心原因。而ARM官方发布的工具链是完整版本,自带适配嵌入式场景的标准库和头文件,所以能正常找到头文件,仅因测试代码未实现嵌入式系统必需的底层系统调用(如_exit、_write)出现链接错误——这正是你提到的预期错误。

解决brew工具链的头文件问题,可按以下步骤操作:

  • 安装配套标准库:执行brew install arm-none-eabi-newlib,该包包含嵌入式目标用的标准C库及头文件。
  • 验证头文件路径:安装完成后,运行arm-none-eabi-gcc -v -E -x c /dev/null查看编译器的头文件搜索路径,确认newlib的头文件目录已被纳入。
  • 手动指定sysroot(若上述步骤无效):编译时通过--sysroot参数指定newlib的安装路径,示例命令:
    arm-none-eabi-gcc --sysroot=$(brew --prefix arm-none-eabi-newlib)/arm-none-eabi test.c
    

需要注意的是,即使解决了头文件问题,用brew工具链编译测试代码仍会出现类似官方工具链的链接错误——因为嵌入式工具链不会链接主机系统的库,必须为目标硬件实现对应的底层系统调用,或使用-nostdlib参数跳过标准库链接(但这样printf等标准函数也无法使用)。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:37:03