Ubuntu 12.04: ld не может найти библиотеку

Я пытаюсь скомпилировать Caffe (http://caffe.berkeleyvision.org/installation.html), и я получаю следующие ошибки:

/usr/bin/ld: cannot find -lcblas
/usr/bin/ld: cannot find -latlas

Однако у меня эти библиотеки установлены (libatlas). Мой LD_LIBRARY_PATH содержит путь /usr/lib/atlas -base и содержит файлы libcblas.so и libatlas.so(и некоторые другие файлы).

Почему ld не может найти эти библиотеки? Спасибо.

Ответ 1

tl; dr: Caffe makefile ищет libblas.so в /usr/lib. Если отсутствует, update-alternatives создает символическую ссылку /usr/lib/libblas.so в том месте, где она установлена. То же самое относится к libcblas.so. LD_LIBRARY_PATH предназначен для среды выполнения и не имеет к этому никакого отношения.


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

Подробнее: если компилировать с помощью gcc или clang, каталоги, в которых искать ссылки для библиотек, предоставляются с использованием флага -L и не учитывают переменную среды LD_LIBRARY_PATH.

Общие местоположения для libblas.so: /usr/lib/atlas-base/ и /usr/lib/libblas/. Makefile для Caffe не делает ничего особенного, чтобы попытаться найти эти подкаталоги и полагается на то, что эти библиотеки находятся в каталоге библиотеки по умолчанию /usr/lib/. Обычно существует символическая ссылка /usr/lib/libblas.so и указывает на реальное местоположение разделяемой библиотеки. По какой-то причине это не было в вашей первоначальной конфигурации.

При работе с несколькими альтернативами для пакетов update-alternatives пригодится. В случае libblas.so он позволяет легко переключаться между несколькими реализациями (libblas, openblas), которые вы, возможно, установили, и делает это, изменяя символические ссылки.

sudo update-alternatives --config libblas.so создал эту символическую ссылку, когда она отсутствовала, что, в свою очередь, позволяет компилятору найти общую библиотеку, решая вашу проблему. Это указывается выходом команды:

 $ sudo update-alternatives --config libblas.so
There is only one alternative in link group libblas.so (providing /usr/lib/libblas.so): /usr/lib/libblas/libblas.so
Nothing to configure.

Те же рассуждения относятся к libcblas.so.

Ответ 2

Оказывается, мне нужно было запустить

sudo update-alternatives --config libblas.so
sudo update-alternatives --config liblapack.so

и выберите libatlas. Я не имею понятия почему,. Если кто-нибудь сможет это объяснить, я дам ему ответ. Спасибо.

Ответ 3

В качестве дополнения к ответу @Ran Ubuntu, в частности, имеет нечетную структуру пакетов для того, что необходимо для Caffe. Я просто наткнулся на этот пост, исправляя эту же проблему на своей машине, и здесь можно помочь, если другие застряли. (Ubuntu 14.04).

libatlas-dev НЕ имеет libatlas-base-dev как зависимость! Кажется, что Caffe нравится библиотеки только от последнего. Установите его.

Затем запустите команды, предлагаемые @Ran, и выберите библиотеки из каталога atlas-base в каталоге /usr/lib. Если только libatlas-dev установлен, альтернативы обновлений будут иметь выход в нижней части сообщения @swalog, но на самом деле не связывают библиотеку атласа, которую, похоже, одобряет кафе! Это должно быть от атласа. Надеюсь, это поможет!

Ответ 4

sudo apt-get install libatlas-base-dev работал у меня, он удалял обе отсутствующие зависимости.

Подробнее см. эту тему https://github.com/BVLC/caffe/issues/559