2016-03-26 4 views
0

Ich mache ein Programm mit einer dynamischen Bibliothek, libexample.so. Die dynamische Bibliothek hängt von einer anderen dynamischen Bibliothek, libtool.so, ab.Wie kann ich die dynamische Bibliothek abhängig von einer anderen dynamischen Bibliothek verknüpfen?

Es sieht Linker erfolgreich Verknüpfung der libexample.so wegen der Nachricht von gcc.

Building target: libexample.so 
Invoking: GCC C++ Linker 
g++ -L/home/takehiro/Documents/documents/code/lib/tool -shared -o "libexample.so" ./classes/example.o ./classes/example_template.o ./classes/example_test.o ./classes/impl.o -ltool 
Finished building target: libexample.so 

cp libexample.so /home/takehiro/Documents/documents/code/lib/example 

Es konnte jedoch nicht mit dem libtool.so verknüpft werden.

ldd /home/takehiro/Documents/documents/code/lib/example/libexample.so 
    ... 
    libtool.so => not found 
    ... 

Ich habe Existenz des libtool.so unter/home/Takehiro/Dokumente/Unterlagen/code/lib/Werkzeug, das durch -L OPTOIN bei Temperaturen oberhalb von Linker durch

ls /home/takehiro/Documents/documents/code/lib/tool 

libtool.so 
spitz

Dies ist das erste Mal, eine dynamische Bibliothek abhängig von einer anderen dynamischen Bibliothek zu verwenden. Ich bin so verwirrt. Ist es normal oder Fehlfunktion? Warum kann es sie nicht verbinden? Hat jemand einen Vorschlag oder eine Lösung für mich? Ich bin sehr froh darüber. Vielen Dank.

Antwort

2

Alles, was die -L Option tut, ist Link zu teilen, wo die gemeinsame Bibliothek ist.

Dies hat keine Auswirkungen darauf, wo der Laufzeitlader nach gemeinsam genutzten Bibliotheken sucht. Aus diesem Grund kann die gemeinsam genutzte Bibliothek zur Laufzeit nicht geladen werden.

Sie müssen auch die Option -rpath an den Linker übergeben, wenn Sie Ihre gemeinsam genutzte Bibliothek verknüpfen, um das Attribut RPATH für die gemeinsam genutzte Bibliothek festzulegen, das angibt, wo die Abhängigkeiten gesucht werden sollen. Etwas wie

g++ -L/home/takehiro/Documents/documents/code/lib/tool \ 
    -Wl,-rpath=/home/takehiro/Documents/documents/code/lib/tool \ 
    ... remaining options 
+0

Vielen Dank Sam Varshavchik für die Beantwortung. Bitte lassen Sie mich folgendes bestätigen. Im Falle einer Ausführungsdatei kann ich LD_LIBRARY_PATH verwenden, um den Speicherort der Bibliothek zu erfahren. Wenn die gemeinsam genutzte Bibliothek jedoch von einer anderen gemeinsam genutzten Bibliothek abhängt, wird LD_LIBRARY_PATH nicht verwendet. Ist es richtig? – mora

+1

Es tut, aber die Verwendung von "-rpath" macht es möglich, LD_LIBRARY_PATH nicht explizit zu verwenden. –

+0

Nochmals vielen Dank, Sam Varshavchik. Ich habe LD_LIBRARY_PATH durch Eclipse verwendet. Es ist ein temporaler LD_LIBRAY_PATH. Dies könnte ein Grund dafür sein, dass das Ausführungsprogramm keine Referenz der Funktion in der gemeinsam genutzten Bibliothek finden konnte. Wie auch immer, ich werde -rpath verwenden. Vielen Dank. – mora