Forum: Compiler & IDEs printf("x") geht, printf("xx"):Linker: undefined reference to `printf'


von Salander (Gast)


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

von Daniel S. (ds1982)


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...

von Yalu X. (yalu) (Moderator)


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.

von Daniel S. (ds1982)


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, das der Linker nicht findet,

jo das hatte ich vergessen zu schreiben, trifft ja aber auf meine 
Vermutung genauso zu ;)

von Martin (Gast)


Lesenswert?

Salander schrieb:
> Ich dachte 'x' ist char

Nur in C++. In C ist das ein int.

von Salander (Gast)


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 
..

von Johann L. (gjlayde) Benutzerseite


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).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Hmmm. Bei printf ("Hallo");wird tatsächlich printf aufgerufen,
> dachte das wird ein fputs.

printf("Hallo\n"); wird ein puts("Hallo");

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.