Lowlevel

Lowlevel => Softwareentwicklung => Thema gestartet von: rizor am 20. July 2011, 20:29

Titel: Multiple Definitions trotz ifndef
Beitrag von: rizor am 20. July 2011, 20:29
Hallo zusammen,

ich habe ein Problem mit dem Linker (ld).
Ich habe mir eine Header-Datei (1) erstellt, die inline-Funktionen definiert, die in eine andere Header-Datei inkludiert wird (2).
Die Kompilierung funktioniert einfach frei.
Sobald der Linker die Object-Files bekommt, meldet er, dass Header-Dateien, die (2) inkludieren, die Funktionen aus (1) redefinieren.
Das dürfte nicht passieren, da ich (1) mit ifndef kapsel.

Was kann der Linker noch falsch machen?

Grüße,
rizor
Titel: Re:Multiple Definitions trotz ifndef
Beitrag von: Jidder am 20. July 2011, 20:53
Mach die Inline-Funktion static.
Titel: Re:Multiple Definitions trotz ifndef
Beitrag von: rizor am 20. July 2011, 20:57
Hab ich. Hat nichts gebracht.
Titel: Re:Multiple Definitions trotz ifndef
Beitrag von: Jidder am 20. July 2011, 21:16
Löst deine Makefile die Abhängigkeiten korrekt auf? Oder hast du make clean nach der Änderung ausgeführt?

Wenn das nicht zur Lösung führt, zeig bitte den Code und die Fehlermeldung. Ansonsten rate ich weiter.
Titel: Re:Multiple Definitions trotz ifndef
Beitrag von: rizor am 20. July 2011, 21:19
Danke.
Das Problem lag am Makefile...
Ich dachte, dass er die Header-Files beachtet.

Danke.

Wird das nicht durch den depend-Befehl gemacht?
Dachte immer, dass depend auch die Header-Abhängigkeiten beachtet.
Titel: Re:Multiple Definitions trotz ifndef
Beitrag von: Jidder am 20. July 2011, 21:29
Den depend-Befehl kenn ich nicht.

Ich mach das mit den Abhängigkeiten immer so: Ich setze in den CPPFLAGS noch den Parameter -MMD. Dann erzeugt der GCC neben jeder .o-Datei noch eine .d-Datei mit den Abhängigkeiten. Diese Dateien binde ich dann noch in etwa so in meine Makefile ein.

DEPS = $(OBJS:.o=.d)

-include $(DEPS)

$(OBJS) ist die Variable, die die Namen der Objekt-Dateien enthält. Das - vor dem include verhindert, dass make Fehlermeldungen ausgibt, wenn die .d-Dateien noch nicht existieren (z.B. beim Kompilieren nach einem make clean.)