printf("x") geht, printf("xx"):Linker: undefined reference to `printf'

Gast #2304130
Lesenswert?

Hallo.

Ich bin gerade am Einstieg in die STM32 Welt.
Benutze Codesourcery, habe ein STM32F107 Board mit einem Blinkbeispiel 
und wollte jetzt über die serielle Schnittstelle etwas ausgeben.

main.c:
1
#include "inc/meine_usart.h"
2
#include <stdio.h>
3
..
4
printf("x");

meine_usart.c:
1
int putchar (int ch) {
2
  USART_SendData(USART1, ch);
3
  return ch;
4
}

Debugger springt durch das printf tatsächlich in die putchar und 
übergibt das 'x' als Zeichen.

Nur wenn ich jetzt aus dem "x" ein "xx" mache, bekomme ich vom Linker 
die Fehlermeldung in der printf-Zeile: undefined reference to `printf'

Ich dachte 'x' ist char und "x" ist char*, genau wie "xx".
Warum meckert der Linker dann bei "xx" ?

Salander
#2304137
Lesenswert?

Ohne von STM32 Ahnung zu haben antworte ich trotzdem mal.

Es gibt einige IDE's die standardmäßig nur eingeschränke 
printf-Funktionalität eingestellt haben um Speicher zu sparen. (Zum 
Beispiel beim CodeComposer von Texas Instruments ists so).

Dort musst du in den Einstellungen für dein Projekt die 
printf-Unterstützung auf "Full" stellen.

Ist das möglicherweise bei dir so?

Betrifft dann btw. auch sprintf...
Moderator #2304138
Lesenswert?

Offensichtlich ersetzt der Compiler printf durch putchar, wenn der
String nur ein einzelnes Zeichen enthält. Bei längeren Strings wird aber
das "echte" printf aufgerufen, das der Linker nicht findet, weil du
vielleicht vergessen hast die Library mit anzugeben, die die
printf-Funktion enthält.
Gast #2304206
Lesenswert?

Toll ist bei www.mikrocontroller.net auch ...
man sucht mit Google nach Leuten mit ähnlichen Probleme und findet 
irgendwann einen Eintrag von jemand, der genau das gleiche schildert.
Ist ein Link zu mikrocontroller.net.

Ach ... das ist ja meine Frage, die ich vor einer Stunde gestellt habe 
..
Persönliche Seite #2304264
Lesenswert?

Yalu X. schrieb:
> Offensichtlich ersetzt der Compiler printf durch putchar, wenn der
> String nur ein einzelnes Zeichen enthält. Bei längeren Strings wird aber
> das "echte" printf aufgerufen, [...]

Hmmm. Bei
1
printf ("Hallo");
wird tatsächlich printf aufgerufen, dachte das wird ein fputs. Mit
1
fprintf (stdout, "Hallo");
wird's dann ein fputs (-Os) oder sogar ein fwrite (-O2).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren