2010-03-03 9 views
5

In C-Programmierung dachte ich, dass eine Objektdatei erfolgreich mit einer .so-Datei verknüpft werden kann, solange die .so-Datei alle Symbole bietet, die in der Header-Datei deklariert wurden.Benötigt das Programm zusätzliche Symbole aus .so shared library außer den in der Header-Datei deklarierten?

Angenommen, ich habe foo.c, bar.h und zwei Bibliotheken libbar.so.1 und libbar.so.2. Die Implementierung von libbar.so.1 und libbar.so.2 ist völlig anders, aber ich denke, es ist in Ordnung, solange beide Funktionen anbieten, die in bar.h deklariert sind.

Ich verknüpfte foo.o mit libbar.so.1 und produzierte eine ausführbare Datei: foo.bin. Diese ausführbare Datei hat funktioniert, als libbar.so.1 in LD_LIBRARY_PATH ist. (Natürlich wird eine symbolische Verbindung als libbar.so hergestellt.) Wenn ich jedoch die symbolische Verbindung zu libbar.so.2 ändere, konnte foo.bin nicht ausgeführt werden und hat dies gemeldet :

libbar.so.1 ist eine C++ gebaute Bibliothek, während libbar.so.2 eine eingebaute Bibliothek ist Ich verstehe nicht, warum foo.bin diese C++ verwandten Symbole nur in libbar.so.1 selbst sinnvoll einsetzen kann, da foo.bin auf reinem c Code foo.c.

Antwort

3

_ZSt4cerr ist offensichtlich ein verstümmelter C++ - Name. Möglicherweise müssen Sie überprüfen, ob Sie den richtigen Compiler verwenden (gcc/g ++, ich weiß, es klingt dumm, aber ich zufällig in solche Verwirrung;)), und wenn es Makros in der bar.h-Datei, die haben könnte referenziert cerr.

+0

Vielen Dank! Es stimmt nicht mit dem Compiler überein. – solotim

+0

Geändert zu einer anderen Frage: http://stackoverflow.com/questions/2371073/how-to-write-c-so-library-to-subsitere-existing-c-so-library – solotim

2

Sie müssen den C++ - Namen vor der Suche abändern. Für gcc gibt es ein C++ filt-Dienstprogramm:

$ c++filt 
_ZSt4cerr 
std::cerr 

Es ist nur Standard-Fehlerdatei-Stream.

0

Sie haben wahrscheinlich vergessen, das gesamte Programm mit der C++ - Standardbibliothek zu verknüpfen.

0

Die Aussage in der Frage ist einfach falsch. Du sagst 'die Header-Datei'. Es gibt keine "die (einzige) Header-Datei." Wenn Sie meinen, dass die Header-Datei eine bestimmte C++ - Klasse deklariert, dann könnte diese Klasse von anderen Klassen erben. Oder es könnte Ausnahmen verwenden. Oder RTTI. In diesem Fall enthält das .so, das den Code enthält, der dazu gehört, 'hängende undefinierte Symbole'. Standardmäßig erwartet man, dass das Hauptprogramm in C++ und mit der C++ - Laufzeit verknüpft ist.

Es ist möglich, zu erstellen, ein eigenständiges .so, aber Sie müssen zusätzliche Arbeit, um es zu erstellen. Möglicherweise müssen Sie verwenden oder einige -l-Bibliotheken angeben, wenn Sie sie verknüpfen oder beides. Dieser Bereich ist nicht gut dokumentiert und benötigt in der Regel einige Archäologie.

+0

In c-Programmierung ich 'Header' enthalten aus was auch immer Bibliotheken beim Kompilieren (nicht Link). Ich meine diese "Header-Datei". Ich bin immer noch nicht ganz sicher über die Bedeutung von "so etwas wie die Header-Datei", würden Sie es bitte mehr erklären? (besser im C-Jargon) Danke! – solotim