Merkwürdiger Fehler, der sich meinen Behebungsversuchen arglistig widersetzt
-
Es geht um Folgendes:
Meine Module müssen von einem externen Szenariengenerator genutzt werden, weshalb in den Header-Files folgende Funktionen stehen müssen, damit der Generator auf sie zugreifen kann:
extern "C" cSimpleModule* create<modulname>(){ return new <modulname>(); } extern "C" void destroy<modulname>(cSimpleModule * csm){ delete csm; }Es gibt in meinem Projekt einige Module, aber nur bei einem einzigen meckert der Compiler - er behauptet, diese Funktion sei anderswo schon einmal definiert worden. ABER: Wenn ich der Funktion auch noch die absurdesten Fantasienamen gebe, bleibt dieser Fehler bestehen (und das ist es, was mich verdutzt).
Hier einmal die Fehlermeldungen im Detail:
1. out/gcc-debug//src/PlcEncap.o: In function
destroyPlcMAC': /home/edema/workspace/libPowerlineBasic/src/PlcMAC.h:151: multiple definition ofdestroyPlcMAC'
out/gcc-debug//src/PlcMAC.o:/usr/include/c++/4.3/bits/ios_base.h:125: first defined here2. out/gcc-debug//src/PlcEncap.o: In function
createPlcMAC': /home/edema/workspace/libPowerlineBasic/src/PlcMAC.h:147: multiple definition ofcreatePlcMAC'
out/gcc-debug//src/PlcMAC.o:/home/edema/workspace/libPowerlineBasic/src/PlcMAC.h:147: first defined hereBei allen Modulen bis auf eines funktionieren die Funktionen (durch Auskommentieren der Problemstelle überprüft). Daher meine Frage: An was könnte es noch liegen? Ich bin für Mutmaßungen offen ...
-
Vielleicht fehlt ein Header-Guard?
-
Implementationen haben in den seltensten Faellen was im Header zu suchen. Dadurch existiert in jeder Compilierungseinheit, dass diesen Header benutzt, eine Implementation dieser Funktion. Obwohl die Implementationen gleich sind, weiss der Linker/Compiler nicht, welche er benutzen soll.
-
@knivil: Die Idee bzw. Vorgabe, die Funktionen im Header anzulegen kommt leider nicht von mir - da hab' ich keinen Einfluß drauf. Auf den ersten Blick könnte man Ihre Antwort in die Kategorie "Besserwisser" einordnen, und auf den zweiten Blick ist sie auch nicht hilfreicher ...
@Belli: Was ist ein Header-Guard?
-
Sorry, knivil ... mein Browser hat zunächst nur der ersten Satz Ihres Beitrages angezeigt. Ich war etwas voreilig - ich bitte, dies zu entschuldigen.
-
Wenn das so bleiben soll, darfst du diesen Header eben nur in einer einzigen .cpp-Datei einbinden.
-
@knivil: Das Header-File wird nur von einem .cc-File benutzt, daher ist dies als Ursache des Problems ausgeschlossen.
-
#ifndef ALREADY_INCLUDED #define ALREADY_INCLUDED // hier deine Deklarationen #endifSinn und Zweck ist es dabei, dass der Compiler den Inhalt nur einmal zu Gesicht bekommt, wenn mehrere Dateien diesen Header einbinden. Schau dir einmal die Standardbibiothek an, alle Dateien haben einen solchen Include-Wächter. Damit kann man also
#include <vector>
#include <vector>
schreiben, ohne dass der Compiler meckert. Der Name sollte natürlich anders lauten, irgendetwas mit Bezug auf den Datei/Klassennamen.
Wenn du allerdings die Heder-Datei nicht verändern kannst, dann darfst du sie auch nur einmal einbinden.
-
Header-Guards sind schon vorhanden (wusste nur nicht, dass das so heißt). Das hilft leider nicht.
-
HolgerK1981+ schrieb:
@knivil: Das Header-File wird nur von einem .cc-File benutzt, daher ist dies als Ursache des Problems ausgeschlossen.
Auch von genau einem?
Ansonsten ist wahrscheinlich die Ursache woanders zu finden.
-
Man könnte auch alles inline machen, in Kombination mit Headerguards sollte dies das Problem beheben. static Variablen in den Funktionen wurden dann natürlich nicht mehr wie geplant funktionieren.
Das alles ist am Herumgedoktere an den Symptomen, das wirkliche Problem ist dies:
HolgerK1981+ schrieb:
@knivil: Die Idee bzw. Vorgabe, die Funktionen im Header anzulegen kommt leider nicht von mir - da hab' ich keinen Einfluß drauf.
Wenn geballte Inkompetenz mit der Macht verbunden ist, diese auch durchzusetzen, dann kann man einfach nicht mehr helfen. Erst wenn dieses Problem gelöst ist, kann man eine zufriedenstellende Lösung finden (und diese Lösung ist auch ganz einfach: Das was man normalerweise macht).
-
"Inline" hat geholfen.
Wenn geballte Inkompetenz mit der Macht verbunden ist, diese auch durchzusetzen, dann kann man einfach nicht mehr helfen. Erst wenn dieses Problem gelöst ist, kann man eine zufriedenstellende Lösung finden (und diese Lösung ist auch ganz einfach: Das was man normalerweise macht).
Oje ... das klingt ja sehr revolutionär ... ich bin schon zufrieden, wenn's einfach nur klappt. Schön muss es nicht sein ...