• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Header-Dateien mehrfach includiert (C)

SP

Member
Hallo,

habe ein theoretisches Problem bei einer kleinen Anwendung in C.

Es gibt drei Quellcode-Dateien und zwei Header-Dateien.

Jede Quellcode-Datei braucht beide Header-Dateien.

Wenn ich jetzt zuerst die Quellcode-Dateien mit

gcc -c datei.c

übersetze und danach mit

gcc -o datei datei1.o datei2.o

linke, bekomme ich eine Fehlermeldung zu einer Mehrfachdefinition (eine Header-Datei enthält ein Typedef). Das lässt sich zwar umgehen, indem ich das Typedef in jeder Quellcode-Datei einmal schreibe, aber gibt es eine elegantere Möglichkeit?

Danke schonmal
SP
 

oc2pus

Ultimate Guru
an den Anfang des headers stellt du einen sogannten "Guard":

Code:
#if !defined(ichbinschonmaldagewesen)
#define ichbinschonmaldagewesen

... 
alter sourcecode
....

#endif

oder

Code:
#ifndef ichbinschonmaldagewesen
#define ichbinschonmaldagewesen

... 
alter sourcecode
....

#endif

typischerweise nennt man das define so wie der Dateiname des Headers
 
OP
S

SP

Member
Das habe ich.

Aber wenn ich jede Quellcode-Datei einzeln übersetze, geht das nicht oder?

Bei

gcc -c datei1.c

ist DATEI1_H nicht definiert. Wenn ich dann mit

gcc -c datei2.c

datei2.c übersetze, ist DATEI1_H aber auch nicht definiert.
 

oc2pus

Ultimate Guru
vergiss das mit den Guards für dein Problem ;)
generell sollst du sie verwenden, aber das Problem ist der linker!

Er entdeckt ein Symbol mehrfach. D.h in diesem Falle darf Programmweit diese Definition nur einmal vorkommen. Damit die zweite Source compiliert werden kann braucht sie eine extern Deklaration dieser Variable.

Ich denke dein typedef ist gleichzeitig auch eine Definition einer Variablen, aber ohne den source-code lässt sich da nix sagen ;)

und bitte auch mal die exakte Fehlermeldung des linkers posten.
 
OP
S

SP

Member
Das Problem ist wohl weniger das Typedef, sondern die Definition einer Variablen in der Header-Datei.

Auszug aus datei.h

Code:
const char id3_identifier[3] = "TAG";

const char* genres[80] = {
...
};
Die Fehlermeldung des Linkers

Code:
datei1.o:(.rodata+0x0): multiple definition of `id3_identifier'
datei2.o:(.rodata+0x0): first defined here
datei1.o:(.data+0x0): multiple definition of `genres'
datei2.o:(.data+0x0): first defined here
collect2: ld gab 1 als Ende-Status zurück
make: *** [datei] Fehler 1
 

oc2pus

Ultimate Guru
die Definition von
Code:
const char id3_identifier[3] = "TAG";
in eine source Datei verlagern.
In der anderen source Datei:
Code:
extern char id3_identifier[3];
sollte den Linker glücklich machen

zum Nachlesen:
http://www.num.math.uni-goettingen.de/Dokumentationen/C/Einfuehrung/modularisierung.html
 
OP
S

SP

Member
Ok, vielen Dank für deine Hilfe, der Link ist auch hilfreich.

Gruß
SP
 
Oben