C ++: Как связать библиотеку, расположенную в папке моего проекта? - PullRequest
3 голосов
/ 10 июля 2010

Я использую Linux и Eclipse.
Я хочу использовать библиотеку ( Box2D ). У меня есть lib-файл "libBox2D.so.2.1.0". Я положил его в самодельную папку lib в папке моего проекта (также рабочий каталог для исполняемого файла).
Я добавил -lBox2D к аргументам командной строки компоновщика. (Это означает, что я добавил «Box2D» в качестве библиотеки в Eclipse GUI).

Но когда я пытаюсь запустить его, мое приложение автоматически печатает, что он не может найти файл библиотеки "libBox2D.so.2.1.0" со следующим сообщением:

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

Я думаю, он ищет эту библиотеку в /usr/lib/ ....

Итак: Как я могу сказать компилятору / компоновщику / "все, что нужно знать", что мое приложение должно искать библиотеку по относительному пути "lib/libBox2D.so.2.1.0" (относительный на рабочий каталог)?

Может быть: Может быть проблема в том, что на странице загрузки Box2D (ссылка здесь выше) они говорят, что это версия 2.1.2, а эта библиотека - версия 2.1.0 (если я посмотрю на soname)?

PS: Я также пытался поместить его в корень папки моего проекта, но это не удалось ...

Любая помощь будет принята с благодарностью.
Спасибо

Ответы [ 2 ]

3 голосов
/ 10 июля 2010

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

Если ваша цель состоит в том, чтобы приложение загружало совместно используемую библиотеку из местоположения относительно приложения, то вам, вероятно, следует при поиске добавить информацию о пути ссылки во время выполнения в свой исполняемый файл. Загруженная среда выполнения использует несколько различных механизмов для обнаружения общих и зависимых объектов при загрузке приложения.

  • Самый распространенный способ - включить полные пути к общим библиотекам. Это то, что большинство компоновщиков делают по умолчанию.
  • Другой метод заключается в том, чтобы включать только имена библиотек и иметь настроенные пути поиска загрузчика (например, те, которые установлены в ldconfig, те, которые настроены в LD_LIBRARY_PATH и т. Д.).
  • Метод, который вы ищете, заключается в кодировании относительного пути поиска во время выполнения

Последний вариант реализован по-разному в зависимости от выбора ОС и компилятора. Я предполагаю, что вы используете набор инструментов GNU для Linux, поэтому взгляните на параметр ld -rpath. Есть несколько хороших примеров - Избегание LD_LIBRARY_PATH упоминает ld -rpath '$ORIGIN/../lib' в качестве опции, Динамические библиотеки, RPATH, ... обсуждает кучу интересной информации, связанной с настройкой пути времени выполнения .

2 голосов
/ 10 июля 2010

Вам нужно установить переменную окружения LD_LIBRARY_PATH .

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

И для небольшого фона это "загрузчик", который нуждается в этом.Так что установите его до запуска вашей программы.

  1. Вы компилируете.
  2. Вы связываете - но так как это общие библиотеки, он не вставляет все символы.
  3. Теперь у вас есть исполняемый файл, который зависит от запуска разделяемых библиотек.
  4. При запуске исполняемого файла загрузчик загружает все разделяемые библиотеки перед запуском программы.
  5. Если он не может найти библиотеку, он вылетит из вашей программы с ошибкой, которую вы видели.
  6. Вы можете указать список путей для поиска, установив LD_LIBRARY_PATH.

Используйте это так:

export LD_LIBRARY_PATH=/path/to/dir
./path/to/executable
...