C语言 找不到非标准标头包含



我没有使用标准的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.我检查了里面有newlibstdint.h

来自 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 $@

请注意,这个论坛吃了标签,Makefiles需要用标签缩进,所以如果你复制粘贴上面的内容,使用例如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(使用不同的启动例程。

最新更新