При запуске компоновщика C ++ отсутствует библиотека (поведение SONAME)
Я создал программу, которая использует две общие библиотеки (которые я скомпилировал) и размещается так:
<code>/home_directory_where_I_compile_and_run_everything -->/lib/libjson_linux-gcc-4.4.6_libmt.so -->/lib/libre2.so.0 </code>
Когда я компилирую свою программу, я передаю относительное расположение этих библиотек компоновщику, например так:
<code>g++ ...... stuff ........ my_program.cc lib/libjson_linux-gcc-4.4.6_libmt.so lib/libre2.so.0 </code>
И он прекрасно компилируется, однако при запуске программы не удается найти libre2.so, и если я проверяю его с помощью ldd, вот что происходит:
<code>.... lib/libjson_linux-gcc-4.4.6_libmt.so (0x00007f62906bc000) libre2.so.0 => not found .... </code>
Очевидно, он признает, что путь на libjson относителен, но на libre2.so.0 он этого не делает (он обрезает весь путь и просто оставляет libre2.so.0).
Может кто-нибудь сказать мне, почему это происходит?
Кроме того, есть ли способ изменить это с помощью аргумента g ++?
Лучший.
* UPDATE * Вау проверить это! Я изменил имя libre2.so.0 на stuff.so, а затем попытался скомпилировать по существу так же, как это:
<code>g++ ...... stuff ........ my_program.cc lib/libjson_linux-gcc-4.4.6_libmt.so lib/stuff.so </code>
И это в любом случае терпит неудачу; он не только терпит неудачу, но и терпит неудачу, потому что не может найти "libre2.so.0".
Whyyy?
* UPDATE # 2 *
Выход дляreadelf -d the_program.o
<code>0x0000000000000001 (NEEDED) Shared library: [lib/libjson_linux-gcc-4.4.6_libmt.so] 0x0000000000000001 (NEEDED) Shared library: [libre2.so.0] </code>
Теперь, если бы я мог просто сделать это [libre2.so.0] как [lib / libre2.so.0], это было бы хорошо.
* UPDATE # 3 *
Как узнал @troubadour:
When an executable is linked with a shared object which has a DT_SONAME field, then when the executable is run the dynamic linker will attempt to load the shared object specified by the DT_SONAME field rather than the using the file name given to the linker.
Вот почему он работает с libjson ..... и не с libre2.so.0. (libjson ..... так что нет записи для SONAME).
И, наконец, я нашел точный вопрос о том, что я ищу:
Is there any way to tell the gcc linker to ignore the SONAME entries on a shared library file and link instead to the specific file path?