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


von John G. (johngo)


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

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


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.

von John G. (johngo)


Lesenswert?

Ich habs also static inline gemacht - funktioniert!

Danke für die schnelle Problemlösung!

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.