mikrocontroller.net

Forum: Compiler & IDEs extern inline - multiple definition error nach compilerupdate


Autor: John Go (johngo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe C-Funktionen in Headerfiles als "extern inline" definiert. Nun 
meckert der Linker: "multiple definition of ...", weil die Funktionen 
von mehreren C-Files aus aufgerufen werden, die Funktionen also mehrfach 
(aber doch nur inline!?) eingefügt werden.

Jedoch: dieses Problem hab ich erst seit einer neuen Compilerversion, 
die ich im Zuge eine Neuinstallation installiert habe:

Ich verwende AVRStudio mit folgender Umgebung:
WinAvr, Release 20080610, darin
GNU Compiler Collection (GCC) 4.3.0 (laut WinAvr Manual).

Vorher, also wies noch keine Fehlermeldungen gab, verwendete ich
WinAvr, Release 20070525, darin
GCC 4.1.2 (laut WinAvr Manual).


Folgende Compileroptionen:
-Wall -gdwarf-2 -std=gnu99  -Winline  -O2 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT


Das Headerfile schaut in etwa so aus:

void function1();

extern inline void function1()
{
...
}



Was stimmt daran nicht, oder nicht mehr?

lg
Johngo

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
John Go wrote:

> ich habe C-Funktionen in Headerfiles als "extern inline" definiert.

Don't do it.

> Nun
> meckert der Linker: "multiple definition of ...", weil die Funktionen
> von mehreren C-Files aus aufgerufen werden, die Funktionen also mehrfach
> (aber doch nur inline!?) eingefügt werden.

Wofür denn aber das "extern", wenn du sie inline haben willst?

Das passt eigentlich nicht wirklich zusammen.  Der einzige Grund
dafür ist, dass man an der Stelle, wo sie außer "inline" auch noch
"extern" ist eine Implementierung der Funktion erhält, die sich für
Externaufrufe eignet (bspw. um davon einen Zeiger zu bilden).

> Jedoch: dieses Problem hab ich erst seit einer neuen Compilerversion,
> die ich im Zuge eine Neuinstallation installiert habe:

Weil der GCC früher seine recht private Idee davon hatte (er kannte
inline-Funktionen schon lange vor dem C-Standard), wie diese beiden
Anforderungen unter einen Hut zu bekommen seien.  Mittlerweile
hat er aber umgeschaltet auf die von C99 vorgeschriebene Variante.

> Was stimmt daran nicht, oder nicht mehr?

Ja, mach die Teile "static inline", wenn du sie wirklich alle inline
bekommen willst.

Autor: John Go (johngo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs also static inline gemacht - funktioniert!

Danke für die schnelle Problemlösung!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.