2016-10-25 2 views
0

Команда создания исполняемого файла:
g++ -I../include/redis -L../lib/redis redis.cpp -o redis -lhiredisКак подключиться к моей собственной библиотеке в gcc?

Описание:
меня libhiredis.so в ../lib/redis/. И в /usr/local/lib/hiredis13/, есть libhiredis.so и libhiredis.so.0.13, это libhiredis.so является ссылка символ libhiredis.so.0.13 .then I ldd redis, вот результат:

linux-vdso.so.1 => (0x00007ffd227f7000) 
libhiredis.so.0.13 => not found 
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f7ebca0d000) 
libm.so.6 => /lib64/libm.so.6 (0x00007f7ebc70b000) 
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f7ebc4f5000) 
libc.so.6 => /lib64/libc.so.6 (0x00007f7ebc132000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f7ebcd23000) 

Gcc должен ссылаться на libhiredis.so в ../lib/redis/, я прав?

+0

'libhiredis.so' в' ../ lib/redis/'не является символьной ссылкой. – CharlesLiuChina

+0

Вам нужно построить свою библиотеку с помощью надлежащего 'soname'. –

+0

@GundolfGundelfinger Спасибо. Я переименовал 'libhiredis.so' в' libhiredis.so.0.13' и сделал 'libhiredis.so' символьную ссылку' libhiredis.so.0.13'. Это сработало! :-) – CharlesLiuChina

ответ

3

Возможно, ваша библиотека имеет SONAME (libhiredis.so.0.13), поэтому программа записывает ее вместо имени файла. Затем, во время выполнения, поиск в SONAME выполняется в обычных каталогах.

Ваша библиотека находится в /usr/local/lib/hiredis13/, и это не обычный каталог. Решение является одним из следующих:

  • Добавить каталог /usr/local/lib/hiredis13 в /etc/ld.so.conf или /etc/ld.so.conf.d/* и повторного запуска ldconfig.
  • Экспортировать переменную окружения LD_LIBRARY_PATH=/usr/local/lib/hiredis13 при запуске программы.
  • Используйте опцию компоновщика -rpath.
+0

Метод '-rpath' является хорошим выбором, так как он будет внедрять путь библиотеки в исполняемый файл, чтобы он не зависел от обновлений/изменений, которые сбрасывают или изменяют' ld.so.conf' или 'LD_LIBRARY_PATH' –

+0

@ DavidC.Rankin Согласовано, Я предпочитаю «LD_LIBRARY_PATH» другим. – CharlesLiuChina

+0

@ DavidC.Rankin: Лично я предпочитаю 'LD_LIBRARY_PATH' и скрипт оболочки, который экспортирует его и запускает двоичный файл. – rodrigo

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