2013-01-31 5 views
5

Ich versuche, eine .so-Datei der Kamera-Bibliothek dynamisch in eine ausführbare Linux-Datei zu laden, um Zugriff auf einfache Kamerafunktionen zu erhalten.Der Zugriff auf .so-Bibliotheken mit dlopen() löst einen undefinierten Symbolfehler aus

Ich bin versucht, dies zu tun durch:

if ((newHandle = dlopen("./libCamera.so",RTLD_LAZY | RTLD_GLOBAL)) == NULL) 
    { 
    printf("Could not open file : %s\n", dlerror()); 
    return 1; 
    } 

jedoch dies nicht gelingt und ich erhalte die folgende Ausgabe: "Datei kann nicht geöffnet: libCamera.so: undefined Symbol: ZTVN10 _cxxabiv117__class_type_infoE"

Wie finde ich heraus, auf welche Symbole es sich stützt?

Antwort

10

Höchstwahrscheinlich libCamera.so verwendet ein Symbol in einer gemeinsam genutzten Bibliothek definiert ohne je auf dieser Bibliothek.

  1. Finden Sie einen Täter. Nehmen Sie eine echte ausführbare Datei, die mit verknüpft (und es funktioniert). Listen Sie seine Abhängigkeiten mit ldd /path/to/executable auf. Unter ihnen sollte eine Bibliothek sein, die eine Definition für ZTVN10_cxxabiv117__class_type_infoE hat (verwenden Sie grep, um wahrscheinlich Kandidaten, nm -D auf eine Bibliothek zu wählen, um sicher zu sein). Diese Bibliothek wird nicht in der von ldd ./libCamera.so gezeigten Liste sein.

  2. Lösen Sie ein Problem. Laden Sie zuerst die in Schritt 1 gefundene Bibliothek von dlopen (verwenden Sie dort auch RTLD_GLOBAL).

  3. Wenn es ein Problem mit einem anderen Symbol ist, gehe zu Schritt 1.

  4. Wenn neu hinzugefügte Bibliotheken auch das gleiche Problem haben, gehe zu Schritt 1.

  5. Sagen Bibliothek Autoren beheben gefallen ihre verlinken.

könnte es auch passieren, dass eine Symboldefinition wurde eine der Voraussetzungen in ldd ./libCamera.so aktualisiert und verloren (vielleicht war es mit einem Compiler neu kompiliert, die Namen anders macht Mangeln). Dann werden Sie den Täter in Schritt 1 nicht finden, und es gibt keine Lösung, aber etwas wieder herabstufen.

6

Der Befehl ldd kann zum Anzeigen von Abhängigkeiten zwischen gemeinsam genutzten Bibliotheken verwendet werden.

ldd libCamera.so 

Sobald Sie die Abhängigkeiten kennen, können Sie nm verwenden, um die Symbole in jeder Bibliothek zu zeigen.

nm -DC libCamera.so 
+0

Ich sah eine Funktion in 'nm -DC libCamera.so' aufgelistet, aber es war immer noch undefiniert. Am Ende stellte sich heraus, dass in der .h-Datei eines der Argumente const & in der .cpp-Datei nicht const war, was dazu führte, dass es nicht definiert war. –

1

In Ihrem Quellcode für libCamera.so haben Sie ein ungelöstes externes Symbol. Es bedeutet, dass type_infoE keine Definition in Ihrem Quellcode haben und sollte aufgelöst werden.

2

Ich hatte ein ähnliches Problem. Es hatte mit einer .a Bibliothek zu tun, die mit meiner .so verknüpft und statisch in das Archiv verlinkt sein sollte.

ich bestimmt diese mit (OP Objektnamen hier verwendet wird):

nm mylibrary.so | grep ZTVN10_cxxabiv117__class_type_infoE 
0000ABC0 U ZTVN10_cxxabiv117__class_type_infoE 

Die U hier means that das Symbol "undefiniert". Sie können die demangled Namen des fehlenden Objekts finden mit --demangle:

$ nm --demangle mylibrary.so | grep 0000ABC0 
0000ABC0 U abi::class_type_info(params...) 

(oder so ähnlich) diese sollen Ihnen helfen, herauszufinden, welche Bibliothek fehlen.

In meinem Fall, auch nach dem Einbinden der Bibliothek in der Compiler-Zeile hatte ich immer noch das Problem. Schließlich, nach einiger Bastelei entdecken ich, dass die Bibliothek-Datei (.a) nach seinem abhängigen Objekt zu kommen hat (.o) Datei wie:

g++ -Wl,-E -g -m32 ... -fPIC myobjects1.o myobjects2.o missing_library.a -shared -o mylibrary.so 

Jetzt bekomme ich (nicht mehr U):

$ nm --demangle mylibrary.so | grep 0000ABC0 
0000ABC0 T abi::class_type_info(params...) 

und vor allem bekomme ich den Fehler nicht mehr!

Verwandte Themen