redefine printf(), sprintf(), etc. arm-none-eabi toolchain
redefine printf(), sprintf(), etc. arm-none-eabi toolchain
我正在使用gcc-arm-none-eabi工具链(目前为7.2.1(设置和环境。这是针对 ARM cortex M4 嵌入式设备。
我想为整个项目重新定义 printf,但我遇到了麻烦。我想使用此实现。我已经将其安装到项目中,我可以通过调用来使用它,例如:printf_("Test: %i",5);
,一切都按预期工作。
现在我想将其设置为默认的 printf 函数。如果我取消注释:#define printf printf_
,我收到以下错误:
/home/timv/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/cstdio:127:11: error: '::printf' has not been declared
using ::printf;
稍后:
src/LoggerTask.cpp:62:5: error: 'printf' was not declared in this scope
在该文件中,我找到了这一行:
#undef printf
当我注释掉那行时,项目构建,printf 工作。这很好,但我希望在不修补工具链的情况下拥有我的项目功能。
我应该怎么做?还有哪些信息会有所帮助?
您可以使用下一个示例创建指向printf
的指针。您需要创建帮助程序文件(在本例中名为"printf_helper.h"和"printf_helper.cpp"(。并将"printf_helper.h"(在所有其他包含的标头之后更好(包含在要使用printf
的文件中。
printf_helper.h:
#ifndef PRINTF_HELPER_H
#define PRINTF_HELPER_H
namespace helper {
typedef int (*printf_t) (const char * format, ...);
extern const printf_t printf_ptr;
}
#endif /* PRINTF_HELPER_H */
printf_helper.cpp:
#include "printf_helper.h"
#include <cstdio>
namespace helper {
const printf_t printf_ptr = std::printf;
}
main.cpp 中的用法示例:
// all other included headers
#include "printf_helper.h"
int main() {
helper::printf_ptr("Hello, %s!n", "World");
return 0;
}
将新文件添加到编译中:
#include <stdarg.h>
int vprintf_(const char* format, va_list va);
int printf(const char *str, ...) {
va_list va;
va_start(va, str);
int ret = vprintf_(str, va);
va_end(va);
return ret;
}
在创建编译输出时针对生成的对象进行编译和链接。就这样。由于链接器的工作方式,链接器应该选择你的符号,而不是 newlib 提供的符号。或者,您可以使用链接器选项--wrap=printf
简单地包装符号。
相关文章:
- redefine printf(), sprintf(), etc. arm-none-eabi toolchain
- arm-none-eabi-g++ 不能使用 -flto 正确处理弱别名
- arm-none-eabi-g++:没有这样的文件或目录
- 使用 arm-none-eabi-gcc、newlib 和 cmake 连接 C/C++ STM32 项目
- 将 LTO 与 arm-none-eabi 和 newlib-nano 一起使用
- 在独立(裸金属)项目上使用std::tuple with arm none eabi gcc
- g++arm none eabi从4.9升级到gcc 8.2.生成的二进制文件不再适合闪存
- 交叉编译错误"arm-none-eabi-g++ cannot find entry symbol"
- arm-none-eabi-g++ 忽略表达式 stm32f4 中的无效字符"#"
- GCC arm-none-eabi (Codesourcery) and C++ Exceptions
- arm-none-eabi-g++ 编译器抛出编译错误pthread_exit未在此范围内声明
- -l在arm none eabi gcc中的用法
- arm-none-eabi-g++ 找不到 stdc++ 标头
- 链接使用 arm-none-eabi-g++ 成功,但不能使用 arm-none-eabi-gcc
- arm-none-eabi- c++调用全局构造函数
- 发送:arm-none-eabi-gdb——version后无法确定GDB版本,response:
- SCONS 错误"sh: 1: arm-none-eabi-gcc: 未找到
- arm-none-eabi-g++正在尝试为桌面而不是arm进行编译
- 代码使用g++编译,但不使用arm-none-eabi-g++
- 如何为MinGW用户安装gcc-arm-none-eabi