c - 使用 arm-none-eabi 工具链时重新定义 fputc 函数

标签 c gcc g++ stm32 redefinition

我们有一个 STM32 C/C++ 项目,我们重新定义了弱的 fputc(int, FILE *) 函数以重定向 printf 输出到一些 UART channel 。

到目前为止,我们在 IAR 下使用 IAR compiler 构建项目.通过 UART 进行的日志记录工作正常。

我们现在已切换到 arm-none-eabi 工具链,并正在使用 g++ 构建项目。但看起来 fputc 函数的重新定义不再链接,因此 UART 日志记录不起作用。

如何通过 printf 强制使用重新定义的函数?

最佳答案

arm-none-eabi- 工具链正在使用 newlib,它允许您重新定义 _write(int fd, const void *buf, size_t count) 而不是所有 stdio输出函数将使用该接口(interface)。 fd==1 对应于 stdoutfd==2 对应于 stderr。您必须提供更多 stub 函数,例如

void _exit(int) {
  while(1)
    ;
}

等它们中的大多数都是微不足道的,但是 printf() 也需要一个有效的 _sbrk(),因为它在内部使用了 malloc()

关于c - 使用 arm-none-eabi 工具链时重新定义 fputc 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51515052/

相关文章:

c - Printf 只打印字符串中的第一个单词?

c - 在哪里可以找到丢失的 "C"包含文件。 (*。H)

php - 使用 PHP 编译 C++

c - macOS 上的 Libsodium,x86_64 的 undefined symbol

linux - 堆栈溢出 - 奇怪的返回地址

c++ - cmake,无法将静态库链接到共享库

c - 输入密码字段时如何检测

c - 在Solaris9机器上生成文件错误: Dont know how to make target

C++ 标准库和 Boehm 垃圾收集器

c++ - 在子文件夹中编译.h和.cpp时的C++ undefined reference