为嵌入式系统使用我自己的本地版本printf时发生GCC链接错误

为嵌入式系统使用我自己的本地版本printf时发生GCC链接错误,gcc,Gcc,我在一个名为small_printf.c的文件中有一个sprintf和printf1的本地版本。工作正常,将调试消息写入串行端口(使用minicom查看消息)。当然,这比在我的微控制器板上调试RTOS时使用四行LCD显示器要好得多 问题是,当我在整个源代码中将printf1重命名为printf时,会出现以下错误。显然,“nostlib”和“nodefaultlibs”选项并没有达到我的预期。为什么我看不出“sprintf”名称有什么问题是令人费解的,只是“printf”有问题 我环顾四周,看看是

我在一个名为small_printf.c的文件中有一个sprintf和printf1的本地版本。工作正常,将调试消息写入串行端口(使用minicom查看消息)。当然,这比在我的微控制器板上调试RTOS时使用四行LCD显示器要好得多

问题是,当我在整个源代码中将printf1重命名为printf时,会出现以下错误。显然,“nostlib”和“nodefaultlibs”选项并没有达到我的预期。为什么我看不出“sprintf”名称有什么问题是令人费解的,只是“printf”有问题

我环顾四周,看看是否有人回答了这个问题,最好的答案是更新到新版本的gcc

Linking: image.elf
arm-none-eabi-gcc -mthumb start.o main_uart.o mam.o sc.o led.o keypad.o timer.o delay.o small_printf.o rtc.o lcd.o uart.o interrupt.o --output image.elf -T./lpc2132.ld -nostartfiles -nodefaultlibs -nostdlib -Wl,--fatal-warnings -Wl,-Map=image.map,--cref

`.rodata.str1.4' referenced in section `.text' of /usr/local/lib/gcc/arm-none-eabi/6.3.0/../../../../arm-none-eabi/lib/thumb/libc.a(lib_a-puts.o): defined in discarded section `.rodata.str1.4' of /usr/local/lib/gcc/arm-none-eabi/6.3.0/../../../../arm-none-eabi/lib/thumb/libc.a(lib_a-puts.o)

`.rodata.str1.4' referenced in section `.text' of /usr/local/lib/gcc/arm-none-eabi/6.3.0/../../../../arm-none-eabi/lib/thumb/libc.a(lib_a-syscalls.o): defined in discarded section `.rodata.str1.4' of /usr/local/lib/gcc/arm-none-eabi/6.3.0/../../../../arm-none-eabi/lib/thumb/libc.a(lib_a-syscalls.o)

我使用的是GCC版本6.3、binutils 2.27和newlib 2.5.0。谢谢你的建议。

如果没有格式说明符,GCC很可能会优化对
printf
put
的调用。为了避免这种情况,如果没有格式说明符,将
-fno内置printf
添加到
CFLAGS

GCC最有可能优化对
printf
的调用以
put
。为了避免这种情况,请将
-fno builtin printf
添加到您的
CFLAGS

CFLAGS+=-fno builtin printf是我添加到Makefile中的内容。伟大的谢谢你…@rsun很乐意帮忙。如果答案是有用的,你可能会考虑+1ITEI,只是发现构建的对象是用LIBC构建的。这不是我想要的嵌入式闪存微控制器。我仍然可以称我的本地印刷品-->“小印刷品”。但是我喜欢了解发生了什么。@rsun所以
-fno-builtin
没有帮助摆脱
put
?然后您可以自己实现
put
(将其重定向到
printf
的实现)。yugr,我回去检查了。它确实奏效了。我想在添加最后一条评论之前,我已经仔细检查了结果。当我同时处理两个项目和五个Makefile时,就会发生这种情况。CFLAGS+=-fno builtin printf是我添加到Makefile中的内容。伟大的谢谢你…@rsun很乐意帮忙。如果答案是有用的,你可能会考虑+1ITEI,只是发现构建的对象是用LIBC构建的。这不是我想要的嵌入式闪存微控制器。我仍然可以称我的本地印刷品-->“小印刷品”。但是我喜欢了解发生了什么。@rsun所以
-fno-builtin
没有帮助摆脱
put
?然后您可以自己实现
put
(将其重定向到
printf
的实现)。yugr,我回去检查了。它确实奏效了。我想在添加最后一条评论之前,我已经仔细检查了结果。当我同时处理两个项目和五个makefile时,就会发生这种情况。