Frage an lib Experten
-
Hallo,
ich habe ein Programm unter Linux, das folgenden Fehler beim Start ausgibt:
Warning: dynamic library '/usr/local/lib/osgPlugins-2.9.5/osgdb_openflight.so' exists, but an error occurred while trying to open it:
/usr/local/lib/osgPlugins-2.9.5/osgdb_openflight.so: undefined symbol: _ZN11OpenThreads6AtomicmmEvWie kann man das Problem beheben?
-
Ich weiss nicht ob das fuers Problem relevant ist, aber meine Maschine ist OpenSuse 11.3 (64Bit) und ich habe mir diese osgdb_openflight.so von einem 32Bit Rechner mit OpenSuse 10.3 kopiert. Das Program, das ich da gestartet habe, ist allerdings ein 32 Bit Executable.
-
fragger2 schrieb:
Ich weiss nicht ob das fuers Problem relevant ist, aber meine Maschine ist OpenSuse 11.3 (64Bit) und ich habe mir diese osgdb_openflight.so von einem 32Bit Rechner mit OpenSuse 10.3 kopiert. Das Program, das ich da gestartet habe, ist allerdings ein 32 Bit Executable.
Die Bibliothek hat andere Abhängigkeiten, die nicht erfüllt sind. Mit einem
ldd
auf die Bibliothek kannst du sehen, was sie braucht.
-
SeppJ schrieb:
fragger2 schrieb:
Ich weiss nicht ob das fuers Problem relevant ist, aber meine Maschine ist OpenSuse 11.3 (64Bit) und ich habe mir diese osgdb_openflight.so von einem 32Bit Rechner mit OpenSuse 10.3 kopiert. Das Program, das ich da gestartet habe, ist allerdings ein 32 Bit Executable.
Die Bibliothek hat andere Abhängigkeiten, die nicht erfüllt sind. Mit einem
ldd
auf die Bibliothek kannst du sehen, was sie braucht.Danke fuer die Antwort.
Hab mal ldd auf osgdb_openflight.so gemacht und neben vielen .so krieg ich auch diese Ausgabe:
libOpenThreads.so.11 => /usr/local/lib/libOpenThreads.so.11 (0xf7695000)
Ich denke das ist die relevante .so, denn er findet ja diese _ZN11OpenThreads6AtomicmmEv nicht. Seltsamerweise habe ich aber diese libOpenThreads.so.11. Wie kann das dennoch schief gehen?
-
fragger2 schrieb:
Ich denke das ist die relevante .so, denn er findet ja diese _ZN11OpenThreads6AtomicmmEv nicht. Seltsamerweise habe ich aber diese libOpenThreads.so.11. Wie kann das dennoch schief gehen?
Dann findet er sie vermutlich nicht. Steht da bei der Ausgabe von ldd ein Pfad dahinter, der auf die Datei verweist?
Oder es ist eine falsche Version.
Es könnte eventuell auch sein, dass die Datei für eine andere Architektur (64 Bit) ist, aber ich denke, dann sollte die Meldung anders lauten.
-
Du kannst dir mit nm auch einach in dem *.so nach dem Symbol suchen. Vielleicht eine andere Calling-Convention? Oder die benutzte Thread-Lib unter 64 Bit ( ich meine pthread wird unter Linux von OpenSceneGraph benutzt ) passt nicht?
Und: ist selbst kompilieren für dich eine Option? Wenn ja: probier doch mal, ob das das Problem heilt.Gruß Kimmi
-
Ok ich habe was interessantes entdeckt.
Das .so ist vorhanden und auch korrekterweise 32 Bit:
file /usr/local/lib/libOpenThreads.so.2.4.0
/usr/local/lib/libOpenThreads.so.2.4.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not strippedDer Fehler ist ja, dass er in osgdb_openflight.so dieses _ZN11OpenThreads6AtomicmmEv nicht findet. Schaue ich im .so nach:
> nm osgdb_openflight.so | grep _ZN11OpenThreads6AtomicmmEv
U _ZN11OpenThreads6AtomicmmEvdann gibt es dieses _ZN11OpenThreads6AtomicmmEv wirklich nicht (das U in der Ausgabe von "nm" steht fuer Undefined). Was bedeutet das ueberhaupt? Wieso steht der Funksioname in dem .so, aber ist undefined?
ldd auf osg_openflight.so gibt ja aus, dass sie libOpenThreads.so.2.4.0 benutzt. Und dieses .so HAT die gesuchte Funktion:
> nm /usr/local/lib/libOpenThreads.so | grep _ZN11OpenThreads6AtomicmmEv
00005370 T _ZN11OpenThreads6AtomicmmEvIch blick da grad nicht durch. Offenbar ist die Funktion (_ZN11OpenThreads6AtomicmmEv) in libOpenThreads.so definiert. Wieso steht das Symbol dann auch in osgdb_openflight.so? Wie fix ich das?
-
Na, es wird von osgdb_openflight.so benutzt, ist dort aber nicht definiert, weil es aus einer anderen Bib kommt. In diesem Fall libOpenThreads.so.2.4.0. Und jetzt ist deine nächste Station herauszufinden, warum er das _ZN11OpenThreads6AtomicmmEv aus der vorhandenen libOpenThreads.so.2.4.0 nicht mag.
-
SeppJ schrieb:
Na, es wird von osgdb_openflight.so benutzt, ist dort aber nicht definiert, weil es aus einer anderen Bib kommt. In diesem Fall libOpenThreads.so.2.4.0. Und jetzt ist deine nächste Station herauszufinden, warum er das _ZN11OpenThreads6AtomicmmEv aus der vorhandenen libOpenThreads.so.2.4.0 nicht mag.
Kann ja eigentlich nur daran liegen, dass die .so auf einer anderen Maschine kompiliert wurden, oder? WIESO es nicht klappt, leuchtet mir nicht ein.
-
/usr/local/lib auf einem 64-bit System sollte ein symlink auf usr/local/lib64 sein (Ich nehme mal einfach an, dass sich opensuse an die üblichen Konventionen hält). 32-bit Bibliotheken gehören dort nicht hin.
-
camper schrieb:
/usr/local/lib auf einem 64-bit System sollte ein symlink auf usr/local/lib64 sein (Ich nehme mal einfach an, dass sich opensuse an die üblichen Konventionen hält). 32-bit Bibliotheken gehören dort nicht hin.
Moooment. Ich dachte /usr/local/lib ist speziell für 32 Bit .so da? Wo sollten auf einem 64 Bit System denn sonst die 32 Bit .so hin?
Meinst du mit symlink, dass ein foo.so in /usr/local/lib auf /usr/local/lib64/foo.so zeigen sollte?