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?
Josef Spillner
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
On Mon, Apr 09, 2001 at 07:10:01PM +0200, 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();
Das ist ok. Es ist die Deklaration.
und im Quelltext void einefunktion();
Das ist nicht ok. Es ist jedenfalls keine _Definition_.
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.
So? Bei mir jedenfalls nicht.
leer.h: void leer(); leer.c: void leer();
main.c: #include "leer.h" int main() { leer(); return 0; }
undefined reference to leer.
Wenn's bei Dir funktioniert hat, dann weiß ich nicht, warum. Hast wahrscheinlich Glück gehabt, daß niemand die Funktion wirklich brauchte, denn sonst würde es auffallen müssen.
Für mich logisch. Denn aus dem Quelltext für leer.h + leer.c folgen einfach zwei identische Funktionsdeklarationen, die der Compiler (weil identisch) durchgehen läßt. Und ansonsten ist's ihm ziemlich egal. Ein `nm leer.o' bringt auch keine Symbole zutage (außer gcc2_compiled).
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.
Ja, jetzt ist es ja auch eine _Definition_.
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?
Man kann sich an korrekten Programmcode gewöhnen ;-)
Best regards from Dresden/Germany Viele Gruesse aus Dresden Heiko Schlittermann
lug-dd@mailman.schlittermann.de