2016-04-19 3 views
1

Итак, у меня есть несколько разделяемых библиотек, которые я пытаюсь установить на своей системе Ubuntu, но у меня есть некоторые трудности с этим.общая библиотека не найдена во время компиляции

Я хочу установить библиотеки и заголовки в отдельной папке под /usr/local/lib и /usr/local/include (например, папка с именем agony), так что это будет чистым и удаление их просто требую, чтобы я удалить эти папки. так это выглядит примерно так:

/usr/local/lib/agony/libbtiGPIO.so 
/usr/local/lib/agony/libbtiDSP.so 
... 

/usr/local/include/agony/GPIO.h 
/usr/local/include/agony/DSP.h 
... 

И я добавил файл здесь /etc/ld.so.conf.d/agony.conf которые включают в себя строку, описывающую путь к папке библиотеки:

$ cat /etc/ld.so.conf.d/agony.conf 
/usr/local/lib/agony 

и я выполняю sudo ldconfig обновить базу данных библиотеки. Так двойной проверки, если библиотека найдена я ldconfig -p | grep bti* и я вижу следующий результат:

$ ldconfig -p | grep bti 
    ... 

    libbtiGPIO.so (libc6,x86-64) => /usr/local/lib/agony/libbtiGPIO.so 
    libbtiDSP.so (libc6,x86-64) => /usr/local/lib/agony/libbtiDSP.so 
    ... 

В этот момент я должен быть в состоянии использовать библиотеки без указания пути к библиотеке. Но когда я пытаюсь скомпилировать приложение, не предоставляя путь к библиотеке (-L), он терпит неудачу. Однако, когда я поставляю gcc с пути библиотеки экс:

gcc source.c -L /usr/local/lib/agony output -lbtiGPIO -lbtiDSP 

это работает !!

Я не хочу использовать переменную окружения LD_LIBRARY_PATH, потому что эта библиотека будет использоваться повсюду в системе, и я не хочу, чтобы другие компиляторы беспокоились о предоставлении LD_LIBRARY_PATH.

Что я здесь делаю неправильно?

ответ

1

В этот момент я должен быть в состоянии использовать библиотеки без указания библиотеки пути

Здесь лежит путаницу.

Вы построили свою разделяемую библиотеку libbtiGPIO.so (просто придерживаться этого один), поместил его в /usr/local/lib/agony и обновил базу данных ldconfig соответственно.

Эффект, который, когда вы запустить программа, которая была связана с libbtiGPIO то динамический компоновщик (/lib/x86_64-linux-gnu/ld-2.21.so или аналогичный) будет знать, где искать , чтобы загрузить эту библиотеку в процесс и вам не нужно будет сообщать об этом, установив LD_LIBRARY_PATH в среде.

Однако, вы не сделали ничего, что влияет на список по умолчанию библиотеки каталогов поиска, вмонтированные в сборку из gcc, что он переходит к линкеру (/usr/bin/ld), когда вы ссылки программы с libbtiGPIO в первую очередь.

Этот список по умолчанию каталогов поиска является то, что вы найдете, если ваш делать многословный сборки вашей программы - gcc -v ... - и затем выбрать значение LIBRARY_PATH от выхода, например,

LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:\ 
     /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:\ 
     /usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:\ 
     /lib/x86_64-linux-gnu/:\ 
     /lib/../lib/:\ 
     /usr/lib/x86_64-linux-gnu/:\ 
     /usr/lib/../lib/:\ 
     /usr/lib/gcc/x86_64-linux-gnu/5/../../../:\ 
     /lib/:\ 
     /usr/lib 

/usr/local/lib/agony не один из тех, и сделать его одним из тех, кого вы бы построить gcc от источника самостоятельно. Следовательно, чтобы связать вашу программу с libbtiGPIO, вам все равно нужно сообщить ld, где ее найти: -L/usr/local/lib/agony -lbtiGPIO.

+0

Спасибо, что освободил Майка. Поэтому, когда я устанавливаю стороннюю библиотеку, используя apt-get, например, она должна устанавливать общие библиотеки и где-то вроде '/ usr/lib', потому что я не указываю путь к библиотеке при использовании этих библиотек. Что, если имя сторонней библиотеки совпадает с именем другого в системе? Это кажется очень плохим дизайном от первого впечатления. – ArmenB

+0

@ Bloody-Band-Aid Пакет не может попасть в фиды пакетов дистрибутива с тем же именем, что и предыдущий. Дистрибулятор управляет своим пространством имен пакетов. Если я устанавливаю исходный пакет, за пределами управления диспетчером пакетов, по умолчанию он будет устанавливать под '/ usr/local', вне пространства дистрибутива. Любая проблема, с которой я сталкиваюсь с неуправляемыми установками, - это полностью моя головная боль. Установка двух библиотек с тем же именем в один и тот же установочный префикс просто не может быть выполнена. Я мог бы установить их в разные установочные префиксы, '/ usr/local/fooA','/usr/local/fooB', но это было бы безумным. –

0

человек, вы неправильно понимаете процедуру complier и ссылку.

Первый, libbtiGPIO.so - это библиотека общих ссылок, а не статическая библиотека ссылок. важно знать эту разницу.

Тогда вам нужно знать что-то еще. изменение ld.so.conf.d/*. conf и запуск sudo ldconfig, это влияет на процедуру ссылки. другими словами, если вы не добавите agony.conf и sudo ldconfig, вы получите сообщение об ошибке при запуске ./a.out, а не gcc source.c -L ...., Команда gcc может успешно работать даже после того, как вы не ldconfig.

И, наконец, если вы не загрязняете переменную среды LD_LIBRARY_PATH, вам нужно добавить -L ... параметры в вашу команду gcc. Более того, если вы не хотите вводить слишком много слов в свою оболочку, вы можете научиться использовать Makefile.

+0

Я никогда не говорил, что это статично, прочитайте первую строку, где я написал «общий», но суть того, что вы сказали, синхронизируется с тем, что только что сказал Майк. Спасибо – ArmenB

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