Где я могу установить DYLD_LIBRARY_PATH в Mac OS X, и это хорошая идея?

28

Я пытаюсь установить решатель, написанный на C ++, на моем Mac (OS X) для использования с кодом, написанным на XCode.

Документация решателя говорит это:

Обязательно иметь "." в вашем DYLD_LIBRARY_PATHдля того, чтобы

  • запустить готовые исполняемые файлы
  • связь с libamg.dylib (и gfortran RTSlibs)

Я не очень понимаю, что это значит. Где и что мне нужно что-то менять?

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

Муравей
источник

Ответы:

20

Это переменная окружения, поэтому она обычно устанавливается в Терминале

export DYLD_LIBRARY_PATH=someValue

man dyld говорит:

DYLD_LIBRARY_PATH

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

Для каждой библиотеки, которую использует программа, динамический компоновщик по DYLD_LIBRARY_PATHочереди ищет ее в каждом каталоге . Если он все еще не может найти библиотеку, он выполняет поиск DYLD_FALLBACK_FRAMEWORK_PATHи DYLD_FALLBACK_LIBRARY_PATHпо очереди.

Используйте -Lопцию для otool(1). чтобы обнаружить рамки и разделяемые библиотеки, с которыми связан исполняемый файл.


Вы, вероятно, хотели бы что-то вроде

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

добавить .(текущий каталог) к списку искомых мест. На моем неизмененном OS X, DYLD_LIBRARY_PATHне имеет текущего значения, хотя:

$ echo $DYLD_LIBRARY_PATH

$

В зависимости от того, как вы собираетесь запускать вашу программу, вам нужно будет установить это по-разному, например, в Xcode (хотя я не знаю, где).

Даниэль Бек
источник
1
Я согласен с @TVNshack, что вы обычно не должны устанавливать DYLD_LIBRARY_PATHни DYLD_FRAMEWORK_PATH, потому что это может помешать этим загруженным библиотекам найти системные библиотеки. Чтобы сделать это лучше, используйте вместо этого FALLBACKверсии. Больше информации в этом ответе: stackoverflow.com/a/3172515/43615
SuperTempel
21

Никогда не следует устанавливать export DYLD_LIBRARY_PATHв вашей системе.

Пути к общей библиотеке можно исправить с помощью otool -Lи install_name_tool.

Например, если вы скомпилируете Perl DBD-MySQL, вы не сможете его использовать, так как компоновщик не знает, где вы установили MySQL.

># make
....


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)


#> install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib blib/arch/auto/DBD/mysql/mysql.bundle


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        /usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)



#> make test
...
Result: PASS

#> make install

Это так просто.

TVNshack
источник
Быстрый FYI: install_name_tool с ошибкой молча, если новый путь длиннее, чем путь, который он заменяет. Всегда проверяйте с помощью 'otool -L', что путь был изменен, как и ожидалось.
user15685
Допустим, я скомпилировал плагин (сам по себе динамическая библиотека), который зависит от другой динамической библиотеки. Как я должен предоставить плагин и его зависимости для других пользователей?
Рой
Если вместо того, чтобы установить DYLD_FALLBACK_FRAMEWORK_PATH, что делает работу в этом случае. Это гораздо проще, чем изменять внутренние пути библиотек, особенно если вам нужно доставить встроенные библиотеки в ваше приложение и не можете предсказать путь, по которому они в итоге окажутся.
SuperTempel
7

В Xcode 4 вы можете добавить его в схему проекта, чтобы избежать ошибок, подобных этой:

dyld: Library not loaded: @loader_path/libLeap.dylib
  Referenced from: /Users/paulsolt/Library/Developer/Xcode/DerivedData/LeapTest-eqcxmzewheyjusgrcszyvlcxlgna/Build/Products/Debug/LeapTest
  Reason: image not found
  1. В меню выберите «Продукт» -> «Редактировать схему» -> вкладка «Аргументы» -> Добавить «Переменные среды» -> Ключ: DYLD_LIBRARY_PATH Значение: / Users / MyUserAccount / path / to / lib

  2. Измените путь к вашей учетной записи пользователя и полный путь к папке библиотеки.

  3. Вы должны быть в состоянии построить и запустить.

Установка DYLD_LIBRARY_PATH в Xcode 4

Пол Солт
источник