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
相关产品推荐
相关产品推荐

