【问题标题】:Cant find non-standard header includes找不到非标准标题包括
【发布时间】:2020-06-10 22:30:33
【问题描述】:

我没有使用标准的gcc 标头。我正在使用-nostdlib 和-nostdinc 选项进行构建。这些选项强制编译器不使用标准头文件。

我正在使用newlib 进行自定义内核开发。 newlib 包含头文件和其他库。

https://stackoverflow.com/a/30792552/13014162

我输入make时的错误:

lib/builtins/lib_int.h:29:12: fatal error: 'stdint.h' file not found
#  include <stdint.h>
           ^
1 error generated.
Makefile:90: recipe for target 'lib/builtins/kern_lib.o' failed

因此,在构建编译器时,应该从newlib(而不是标准头文件)中获取stdint.h。为什么不捡呢?

此项目之前已由其他人构建。所以我的设置中有一些错误。我相信包含路径和其他东西是正确设置的,因为其他人能够构建它。

谁能具体指出我如何使用 newlib。我检查了newlib 里面有stdint.h。

【问题讨论】:

  • 因为您使用了-nostdlib 和-nostdinc。只需指定包含目录并链接到 newlib 对象库,就像使用任何其他库一样。
  • @KamilCuk 是的,-nostdlib 不应从标准标题中提取。但是,它应该从newlib 获取。我的问题是为什么它不是从newlib
  • 已经告诉你了:specify the include directory and link with newlib object library like you would with any other library。也就是说,使用-I 和-L 告诉工具链newlib 头文件和库的安装位置。
  • 您执行什么编译器命令行来获取您显示的错误?它一定是遗漏了关键信息——或者关键信息一定是错误指定的(这无异于同一个问题)。
  • @NeedSomeLuck 标头没有害处。操作系统开发人员通常不使用完全不同的标准库。 stdint.h 是应该使用的头文件之一,而不是自制的 BYTE、WORD、DWORD、U8、u8、U8PTR_t 和类似的怪物

标签: c linux linux-kernel clang newlib


【解决方案1】:

来自 newlib README.txt 文件:

要针对共享的 newlib 编译程序:

gcc -nostdlib $(target_install_dir)/lib/crt0.o progname.c -I $(target_install_dir)/include -L $(target_install_dir)/lib -lc -lm -lgcc

要运行程序,请确保 $(target_install_dir)/lib 已列出 在LD_LIBRARY_PATH 环境变量中。

要创建链接到 newlib 的静态二进制文件,请执行以下操作:

gcc -nostdlib -static $(target_install_dir)/lib/crt0.o progname.c -I $(target_install_dir)/include -L $(target_install_dir)/lib -lc -lm

上面是用Makefile格式写的,progname.c是要编译的源文件名,$(target_install_dir)是newlib的安装目录。如果不确定,可以运行find ~/ /usr /lib* -name crt0.o; newlib 应安装在输出之一上方的两个目录中。如果该命令没有输出任何内容,则说明您尚未安装 newlib。

就个人而言,我会尝试使用以下 Makefile:

INCNEWLIB := /usr/include/newlib
LIBNEWLIB := /usr/lib/arm-none-eabi/newlib
CRT0      := $(LIBNEWLIB)/crt0.o
CC        := /usr/bin/arm-none-eabi-gcc
CFLAGS    := -Wall -Wextra -O2
LDFLAGS   :=

%.o: %.c
    $(CC) $(CFLAGS) -nostdlib -I $(INCNEWLIB) $^ -c -o $@

# For dynamically linked binary executables:
dynamic-bin: your.o object.o files.o here.o
    $(CC) $(CFLAGS) -nostdlib $(CRT0) $^ -L $(LIBNEWLIB) -lc -lgcc $(LDFLAGS) -o $@

# For statically linked binary executables:
static-bin: your.o object.o files.o here.o
    $(CC) $(CFLAGS) -static -nostdlib $(CRT0) $^ -L $(LIBNEWLIB) -lc $(LDFLAGS) -o $@

请注意,此论坛使用制表符,并且 Makefile 需要使用制表符缩进,因此如果您复制粘贴上述内容,请使用例如修复缩进。 sed -e 's|^ *|\t|' -i Makefile.

以上路径适用于 Debian/Ubuntu/Mint ARM newlib,编辑它们以匹配您的系统和个人偏好。

您可以在命令行覆盖任何变量。例如,make CRT0=/usr/lib/arm-none-eabi/newlib/thumb/v7e-m/fpv5/hard/crt0.o 对二进制可执行文件 (v7e-m hard-fpv5) 使用不同的启动例程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2017-11-26
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多