PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit der Mehrfacheinbindung von Bibliotheken



Thorben W
11.02.2014, 20:45
Moin,

ich versuche gerade die Arduino Ethernetbibliotheken in C umzuwandeln weil ich mir dadurch mehr Platz erhoffe.
Jetzt habe ich das Problem, dass ich in der C datei Ethernet.c, EthernetServer.c, EthernetClient.c und socket.c die Headerdatei W5100.h einbinde und habe das Problem das der Compiler (AtmelStudio6) als Fehlermeldung ausgibt " multiple definition of `W5100_RSIZE' ". Ich denke das es daran liegt das ich die Headerdatei mehrmals einbinde.
Wenn ich die Headerdatei nur an einer Stelle einbinde dann
funktioniert es nicht und

#ifndef W5100_H_
#defineW5100_H_
...Deklarationen...
#endif
hat auch noch nicht den gewünschent Zweck gehabt.
Hier das Projekt:27483
Danke schonmal für eure Hilfe.
Thorben

shedepe
12.02.2014, 14:03
Hast du schon einfach mal in der kompletten Solution nach W5100_RSIZE gesucht und geschaut , dass du es nicht doch doppelt definiert hast. Ansonsten sehen deine Include Guards korrekt aus.

Thorben W
12.02.2014, 14:14
Danke schon mal für deine Antwort.
Das mit "W5100_RSIZE" war nur ein Beispiel
Hier mein ganzer Output:27484

Ich habe schon mal danach gesucht aber keine andere Definition gefunden.

Thobe

EDIT: Es sind ja alle Deklarationen in dem Header betroffen

sternst
12.02.2014, 17:06
und

#ifndef W5100_H_
#defineW5100_H_
...Deklarationen...
#endif
hat auch noch nicht den gewünschent Zweck gehabt.Include-Guards verhindern das mehrfache Einbinden in ein und dieselbe Datei. Das hat mit deinem Problem nicht das geringste zu tun.



Es sind ja alle Definitionen in dem Header betroffenUnd genau dieses "Definitionen" ist hier das Problem. Die gehören nun mal nicht in einen C-Header. Da gehören nur Deklarationen rein.



ich versuche gerade die Arduino Ethernetbibliotheken in C umzuwandelnAuch wenn das jetzt vielleicht etwas hart klingt, aber das eigentliche Problem scheint mir zu sein, dass du etwas versuchst, zu dem dir schlicht das nötige Grundlagenwissen fehlt.

Thorben W
13.02.2014, 16:28
Und genau dieses "Definitionen" ist hier das Problem. Die gehören nun mal nicht in einen C-Header. Da gehören nur Deklarationen rein.
Entschuldigung ich bin auch nicht Perfekt habe mich falsch ausgedrückt. Um es klar zu stellen ich meinte die Deklarationen.


Include-Guards verhindern das mehrfache Einbinden in ein und dieselbe Datei. Das hat mit deinem Problem nicht das geringste zu tun.
Das heißt also, das die Datei von unterschiedlichen Dateien trotzdem mehrfach eingebunden wird?

Thorben

sternst
13.02.2014, 22:20
Entschuldigung ich bin auch nicht Perfekt habe mich falsch ausgedrückt. Um es klar zu stellen ich meinte die Deklarationen.Es SIND aber Definitionen.



Das heißt also, das die Datei von unterschiedlichen Dateien trotzdem mehrfach eingebunden wird?Natürlich, so muss das auch sein.

Wsk8
14.02.2014, 22:28
So viel ich gesehen habe, liegt das Problem in w5100.h.


#define __GP_REGISTER8(name, address) \
inline void W5100_write##name(uint8_t _data) { \
W5100_write(address, _data); \
} \
inline uint8_t W5100_read##name() { \
return W5100_read(address); \
}

#define __GP_REGISTER16(name, address) \
void W5100_write##name(uint16_t _data) { \
W5100_write(address, _data >> 8); \
W5100_write(address+1, _data & 0xFF); \
} \
uint16_t W5100_read##name() { \
uint16_t res = W5100_read(address); \
res = (res << 8) + W5100_read(address + 1); \
return res; \
}

#define __GP_REGISTER_N(name, address, size) \
extern uint16_t W5100_writeg##name(uint8_t *_buff) { \
return W5100_writeg(address, _buff, size); \
} \
extern uint16_t W5100_readg##name(uint8_t *_buff) { \
return W5100_readg(address, _buff, size); \
}

Diese ganzen defines erstellen verschiedene Funktionen (namentlich). Bei jedem einbinden werden diese Funktionen neu erstellt, deshalb schreit der Compiler.
Entweder defines rausschmeißen und sauber ausprogrammieren oder die Implementierung in die .c verlagern und in der .h nur die Prototypen erstellen.

Waren auch noch ein paar andere Fehler drin. Das kompiliert zumindest.



mfg