2016-03-26 2 views
0

Я делаю программу с использованием динамической библиотеки libexample.so. Динамическая библиотека зависит от другой динамической библиотеки libtool.so.Как связать динамическую библиотеку в зависимости от другой динамической библиотеки?

Это выглядит, как линкер, удалось связать libexample.so из-за сообщения из 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 

Однако он не смог связать его с libtool.so.

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

Я проверил существование libtool.so в/дома/Такэхиро/Документы/документы/код/​​Lib/инструмент, который указываемой -L optoin при температуре выше линкера по

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

libtool.so 

Это в первый раз использовать динамическую библиотеку в зависимости от другой динамической библиотеки. Поэтому я так смущен. Это нормально или неисправно? Почему он не может их связать? У кого-то есть предложение или решение для меня? Я очень рад этому. спасибо.

ответ

2

Все, что делает опция -L, сообщает компоновщику, где находится общая библиотека, во время связи.

Это не влияет на то, где загрузчик времени выполнения выполняет поиск разделяемых библиотек. Вот почему общая библиотека не загружается во время выполнения.

Вам также необходимо передать опцию -rpath в компоновщик, когда вы связываете свою общую библиотеку, чтобы установить атрибут RPATH в общей библиотеке, который указывает, где искать его зависимости. Что-то вроде

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

Спасибо, Сэм Варшавчик, за ответ. Пожалуйста, позвольте мне подтвердить следующее. В случае файла исполнения я могу использовать LD_LIBRARY_PATH, чтобы узнать местоположение библиотеки. Однако в случае использования общей библиотеки в зависимости от другой общей библиотеки она не использует LD_LIBRARY_PATH. Это правильно? – mora

+1

Это так, но использование '-rpath' позволяет не использовать LD_LIBRARY_PATH явно. –

+0

Еще раз спасибо, Сэм Варшавчик. Я использовал LD_LIBRARY_PATH через eclipse. Это временная LD_LIBRAY_PATH. Это может быть причиной того, что программа выполнения не могла найти ссылку на функцию в общей библиотеке. Во всяком случае, я буду использовать -rpath. Большое спасибо. – mora

Смежные вопросы