Forum: Compiler & IDEs Atmel Studio 7 -> conflicting declaration of C function utoa


von Kilian K. (kellermaaan)


Lesenswert?

Guten Morgen zusammen,

ich habe leider ein kleines Problem. Momentan arbeite ich mit Atmel 
Studio 7 und dem Atmel-ICE Basic damit ich meinen Arduino Due debuggen 
kann. Da ich aber vorher mit Visual Studio gearbeitet habe, musste ich 
erst mein vorhandenes Projekt im Atmel Studio lauffähig bekommen.

Das meiste habe ich glaub ich bereinigt, allerdings bekomme ich jetzt 
immer die folgende Fehlermeldung:
1
error: conflicting declaration of C function 'char* utoa(long unsigned int, char*, int)'

Diese Funktion gibt es in der stdlib und in der itoa.h für Arduino...

Könnte mir vielleicht jemand sagen, wie ist das beheben kann? Hab leider 
vorher nocht nichts mit dem Atmel Studio gemacht, deshalb kenne ich mich 
mit der Umgebung noch nicht so aus...

Gruß Kilian

von A. S. (Gast)


Lesenswert?

offensichtlich hast Du verschiedene Declarationen von utoa. Das erste 
Argument sollte m.E. 'unsigned int' sein.

Ist das die komplette Fehlermeldung?
Gibt es evt. noch Hinweise auf andere Codezeilen?
Kannst Du die beiden von Dir gefundenen Deklarationen hier auch posten?

von Kilian K. (kellermaaan)


Lesenswert?

Also es gibt ein Warning in der stdlib.h:
1
c:\program files (x86)\atmel\studio\7.0\toolchain\arm\arm-gnu-toolchain\arm-none-eabi\include\stdlib.h(201,8): info: previous declaration 'char* utoa(unsigned int, char*, int)'
2
     char * _EXFUN(utoa,(unsigned, char *, int));

Und danach kommt die Fehlermeldung in der itoa.h:
1
c:\program files (x86)\arduino\hardware\arduino\sam\cores\arduino\itoa.h(34,65): error: conflicting declaration of C function 'char* utoa(long unsigned int, char*, int)'
2
     extern char* utoa( unsigned long value, char *string, int radix ) ;

von A. S. (Gast)


Lesenswert?

Nutze nur die Header, dessen Lib Du auch einbindest.

Wenn Du 2 Libs mit 2 unterschiedlichen Funktionen gleichen Namens 
verwenden willst, hast Du ein Problem.

von Kilian K. (kellermaaan)


Lesenswert?

Achim S. schrieb:
> Nutze nur die Header, dessen Lib Du auch einbindest.
>
> Wenn Du 2 Libs mit 2 unterschiedlichen Funktionen gleichen Namens
> verwenden willst, hast Du ein Problem.

Ich habe immer nur die "stdlib.h" eingebunden und nie die "itoa.h". Ich 
habe auch mal die includes von stdlib auskommentiert, hat aber auch 
nicht geholfen.

Kann es vielleicht daran liegen, dass ich den Ordner von "itoa.h" 
mitlinke? Allerdings benötige ich den Ordner für die "Arduino.h" etc.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Das scheint ein Bug

  https://github.com/arduino/Arduino/commit/549a8055fa31ba23365e8d5849570a93bff3073f

gewesen und im aktuellen Arduino-Release (1.6.13) behoben worden zu
sein.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Kilian K. schrieb:
> c:\program files
> (x86)\atmel\studio\7.0\toolchain\arm\arm-gnu-toolchain\arm-none-eabi\inc 
lude\stdlib.h(201,8):
> info: previous declaration 'char* utoa(unsigned int, char*, int)'
>      char * _EXFUN(utoa,(unsigned, char *, int));
>
> Und danach kommt die Fehlermeldung in der itoa.h:c:\program files
> (x86)\arduino\hardware\arduino\sam\cores\arduino\itoa.h(34,65): error:
> conflicting declaration of C function 'char* utoa(long unsigned int,
> char*, int)'
>      extern char* utoa( unsigned long value, char *string, int radix ) ;

Im INCLUDE-Pfad auf dem Rechner werden die Include-Dateien zweier 
Entwicklungssysteme gemischt, einerseits Atmel Studio 7, andererseits 
Ardiuno.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Rufus Τ. F. schrieb:
> Im INCLUDE-Pfad auf dem Rechner werden die Include-Dateien zweier
> Entwicklungssysteme gemischt, einerseits Atmel Studio 7, andererseits
> Ardiuno.

Das Atmle Studio kann nichts dafür. Der Konflikt kommt daher, dass itoa
und seine Brüder sowohl in der Arduino-Bibliothek als auch neuerdings
(seit ca. 2 Jahren) in der Newlib, die ebenfalls von Arduino verwendet
wird, definiert sind.

Das alleine wäre aber noch kein Problem, wenn die Signaturen dieser
Funktionen in beiden Bibliotheken übereinstimmen würden. Dann würde eben
jeweils diejenige Funktion gelinkt, die der Linker als erste in einer
der beiden Bibliotheken findet.

Da aber in der Arduino-Bibliothek irrtümlicherweise das erste Argument
von utoa als unsigned long statt unsigned int deklariert wurde, kommt es
hier zum Konflikt. Dieser Fehler ist aber wohl mittlerweile behoben.

Anstatt die Signatur in der Arduino-Bibliothek zu korrigieren, hätten
die Arduino-Entwickler diese Funktionen IMHO auch gleich komplett
entfernen können, da sie ja nun in der Newlib enthalten sind.

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.