Multiple Definition Problem
-
Hi
Ich habe ein Programm, das aus mehreren Klassen besteht. Es läßt sich einwandfrei compilieren.
Dann habe ich jetzt folgende einfache neue Datei:
MyFunc.h#ifndef _MYFUNC_H_ #define _MYFUNC_H_ size_t ganzKomischerNameDenSonstKeinerBenutzt(const unsigned long & adr) { size_t a; a = adr % 701; return a; }; #endif /*_MYFUNC_H_*/
Wenn ich jetzt diese Datei includiere über "#include "MyFunc.h"" - dann erhalte ich folgenden Compilerfehler:
Building target: simu Invoking: GCC C++ Linker g++ -osimu ./MemStatistic.o ./main.o ./memsim.o (und noch einige mehr) ./main.o(.text+0x100): In function `ganzKomischerNameDenSonstKeinerBenutzt(unsigned const&)': : multiple definition of `ganzKomischerNameDenSonstKeinerBenutzt(unsigned const&)' ./MemStatistic.o(.text+0x100): first defined here ./memsim.o(.text+0x100): In function `ganzKomischerNameDenSonstKeinerBenutzt(unsigned const&)': : multiple definition of `ganzKomischerNameDenSonstKeinerBenutzt(unsigned const&)' ./MemStatistic.o(.text+0x100): first defined here collect2: ld returned 1 exit status
Sobald ich das "include "MyFunc.h"" rausnehme compiliert das Programm wunderbar.
Wieso kriege ich diesen Fehler ? Ein Include-Guard ist doch vorhanden und nur in einer einzigen Datei includiere ich diese "MyFunc.h" auch wirklich.Ich raff das nicht
GCC 3.3.3, Linux <- nutze ich.
-
Benja_m schrieb:
Ein Include-Guard ist doch vorhanden
Includewächter schützen dich nur vor dem mehrfachen Einbinden einer Datei in einer Übersetzungseinheit.
und nur in einer einzigen Datei includiere ich diese "MyFunc.h" auch wirklich.
Kann nicht sein. Sonst würde sie nicht drei Übersetzungseinheiten (MemStatistic.o, memsim.o und main.o) landen.
-
ich könnte dir jetzt die ganzen Quelltexte schicken. Dann würdest du sehen, dass definitiiv NUR in "MemStatistic.h" "MyFunc.h" includiert wird.
Diese "MemStatistic.h" wird in "memsim.h" includiert.
Die wiederum in "main.h"Alle sind mit dieser "#ifndef _DATEI_H_"" Abfrage "gesichert".
-
Benja_m schrieb:
Diese "MemStatistic.h" wird in "memsim.h" includiert.
Die wiederum in "main.h"Na da haben wir's doch. Damit landet diese Funktion in jeder ÜE, die eine dieser Headerdateien einbindet.
Alle sind mit dieser "#ifndef _DATEI_H_"" Abfrage "gesichert".
Ich sagte doch bereits, dass dich Includewächter davor nicht schützen. Die Definition darf nur in einer ÜE auftauchen.
-
Ok. Dann habe ich das irgendwie missverstanden.
Dann muss ich mal sehen, wie ich das fixe.
Danke !
-
Benja_m schrieb:
Ok. Dann habe ich das irgendwie missverstanden.
Dann muss ich mal sehen, wie ich das fixe.
Du packst die obige Definition in eine eigene Datei "myfunc.cpp" (oder in eine vorhandene CPP-Datei deines Projekts) und lässt in der .h nur noch den Prototyp "size_t ganzKomischerNameDenSonstKeinerBenutzt(const unsigned long & adr);" stehen.
-
CStoll schrieb:
Benja_m schrieb:
Ok. Dann habe ich das irgendwie missverstanden.
Dann muss ich mal sehen, wie ich das fixe.
Du packst die obige Definition in eine eigene Datei "myfunc.cpp" (oder in eine vorhandene CPP-Datei deines Projekts) und lässt in der .h nur noch den Prototyp "size_t ganzKomischerNameDenSonstKeinerBenutzt(const unsigned long & adr);" stehen.
oder er definiert die funktion inline. dann gibt es noch zwei schlechte varianten:
- deklaration in anonymem namespace
- deklaration mit static