C 对微控制器进行编程时具有未定义引用的标准 lib 函数

C Standard lib functions having undefined reference when programming microcontroller

提问人:temp1445 提问时间:11/7/2022 更新时间:11/7/2022 访问量:108

问:

我正在尝试为 RISCV 处理器编写一个固件,该处理器应该将一些数据馈送到数字电路。我想从文件中获取该数据,而不是在 c 固件中生成它。但是当我尝试启动模拟时,所有 stdlib 函数(例如 fopen()、fgets()、fclose() 和 memcpy() 都将具有未定义的引用。我检查了makefile,我看到了这个:

%.elf: %.c $(LINKER_SCRIPT) $(SOURCE_FILES)
    ${GCC_PATH}/${GCC_PREFIX}-gcc -g \
    -I$(FIRMWARE_PATH) \
    -I$(VERILOG_PATH)/dv/generated \
    -I$(VERILOG_PATH)/dv/ \
    -I$(VERILOG_PATH)/common \
      $(CPUFLAGS) \
    -Wl,-Bstatic,-T,$(LINKER_SCRIPT),--strip-debug \
    -ffreestanding -nostdlib -o $@ $(SOURCE_FILES) $<

因此,添加了 -nostdlib 选项。我的问题是,我应该定义所有我需要的 std 函数,让程序像这里一样工作,还是有任何其他方法。此外,从 makefile 中删除该选项将导致一些错误。

我正在使用 gcc 9.4.1。和 riscv-gnu-toolchain-rv32i。任何意见将不胜感激。

c GCC 标准 RISCV

评论

2赞 n. m. could be an AI 11/7/2022
-nostdlib表示没有标准库。例如,您期望的定义从何而来?fopen
0赞 temp1445 11/7/2022
@n.m. 是否有任何未使用 stdlib 的函数实现可用于此目的?
0赞 n. m. could be an AI 11/7/2022
这些函数的实现将是 stdlib(至少部分)。
0赞 temp1445 11/7/2022
谢谢,那么我别无选择,只能在同一程序中生成数据。

答:

0赞 Peter Irich 11/7/2022 #1

我怎么记得 newlib 是程序编译微控制器所必需的, 因为标准函数是从中调用的,但我不知道从哪里来 newlib 可以下载。

评论

0赞 temp1445 11/7/2022
谢谢,你能解释更多吗?这对我来说有点难以理解