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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.