Подтвердить что ты не робот

Библиотеки в /usr/local/lib не найдены

Я создаю приложение, используя фреймворк ohNet. После создания фреймворка существует возможность установить фреймворк через make install. По умолчанию библиотеки устанавливаются внутри папок /usr/local/[lib|include]. ок.

Я использую eclipse для разработки. Чтобы использовать эти библиотеки, я должен установить путь включения в библиотеку (в данном случае usr/local/include/ohNet), установить путь поиска Linker (-L) (/usr/local/lib/ohNet) и конкретные библиотеки (-l) (в этом случае Я выбираю библиотеку с именем libohNet.so, которая в этой папке. Когда я создаю проект в eclipse, он отлично работает, однако, если я пытаюсь запустить программу, я столкнулся со следующим сообщением:

error while loading shared libraries: libohNet.so: cannot open shared object file: No such file or directory

Я дважды проверил это, и файл libohNet.so находится в этом каталоге! Какая причина, по которой этот файл не найден?

Я искал в google и нашел несколько сообщений, говоря, что проблематично, что библиотеки устанавливаются в /usr/local/lib вместо /usr/lib см. здесь... Нужно ли мне настраивать некоторые дополнительные параметры в eclipse, чтобы ld распознавать библиотеки по этому пути? Какое решение для этого?

рассматривает

4b9b3361

Ответ 1

Это ошибка времени выполнения, а не ошибка сборки. Установка флага -L ничего не делает для компоновщика времени выполнения. Вам нужно сказать, чтобы загрузчик времени выполнения также просматривал в /usr/local/lib для библиотек. Вы можете сделать это двумя способами. Первый заключается в добавлении пути к переменной среды LD_LIBRARY_PATH:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"

Во-вторых, необходимо обновить конфигурационный файл компоновщика времени выполнения. Это может произойти либо в файле /etc/ld.so.conf, помещая строку:

/usr/local/lib

где-нибудь в этом файле или создав новый файл *.conf в каталоге /etc/ld.so.conf.d/, который содержит новый путь. Например:

/etc/ld.so.conf.d/99local.conf

с помощью только:

/usr/local/lib

. Это рекомендуемый способ сделать это, так как он позволяет вам сохранять свои собственные пути библиотеки отдельно от путей, установленных системой. (Префикс "99" должен убедиться, что файл загружен последним по сравнению с другими файлами там, так что он не будет вытеснять системные пути, которые могут содержать одни и те же библиотеки.)

После изменения/создания файла в /etc, вам нужно запустить:

ldconfig

как root, чтобы изменения вступили в силу. (Эта команда обновляет файл /etc/ld.so.cache, который является фактическим файлом, используемым компоновщиком времени выполнения.)

Существует также другой способ для двоичного файла найти нужные библиотеки во время выполнения. Вы можете на самом деле жестко закодировать пути библиотеки к самому исполняемому файлу. Это достигается установкой так называемого "rpath". Это опция компоновщика и должна быть передана из gcc (или g++) в компоновщик, поэтому необходимо использовать параметр -Wl. Опция компоновщика -rpath=PATH. Поэтому вам нужно добавить это в свои флаги ссылок:

-Wl,-rpath=/usr/local/lib

Я не рекомендую это для вашего дела. Rpath полезен, когда вы отправляете библиотеки вместе с исполняемым файлом (возможно, с установщиком), а относительный rpath (с использованием функции rpath $ORIGIN) или абсолютный (например, когда вы устанавливаете в /opt, например) используется для поиска вложенных библиотек во время выполнения.