On Monday 09 April 2001 19:10, Josef Spillner wrote:
Hallo,
wieder eines meiner komischen Probleme... es ist zwar schon notdürftig behoben, aber die Ursache kenne ich nicht.
Es geht um leere Funktionen in C. Wenn im Header steht void einefunktion(); und im Quelltext void einefunktion(); dann ist das eigentlich legal - es ist halt eine leere Funktion. Steckt man das ganze dann in eine Bibliothek, dann gibt es auch noch keinen Unterschied. Auch wenn man die Funktionen in C++-Programmen verwendet ist alles in Butter. Baut man sich allerdings eine Shared Library (C++), die darauf aufbaut, und verwendet diese dann in einem C++-Programm, dann meckert er (der Linker) genau auf diese Art von Funktionen eine "undefined reference" an. Ich habe das also umgeändert auf void einefunktion(){} und schon geht es.
Der Aufbau ist also: libcfunc.so -> libcppfunc.so -> bincpp
Weder ich noch der Original-Autor haben dazu eine Erklärung parat. Gibt es eventuell Programme/Makros dafür, die eine Warnung ausstoßen, wenn sie sowas "sehen"? (Der Quelltextbaum wird komplett mit GNU Autotools verwaltet) Oder kann man dem Compiler per Option sagen daß er die beiden Formen gleich behandeln soll?
Ja, schreib die Header Datei (die Du beide Male einbindest) so:
#ifdef __cplusplus extern "C" { #endif
void einefunktion();
#ifdef __cplusplus } #endif
Oder so (nur in C++):
extern "C" void einefunktion();
Man muss dem Compiler sagen, dass er die Parametertypen nicht in den Namen eincodieren darf (Stichwort "name mangling").
Konrad