dyld: библиотека не загружена: ../lib/abc.dynlib - PullRequest
1 голос
/ 28 декабря 2011

У меня проблемы с запуском моего проекта XCode 4.2 для динамической библиотеки (dynlib).

Что я делаю, это добавляю библиотеку в проект xcode, а затем создаю новый «Копировать файлы»фаза сборки с этой библиотекой.

Проект работает (!) хорошо, если я установил Destination на этапе сборки равным «Каталогу продуктов», но затем я должен поставить библиотеку вместе с приложением, а не встроеннымвнутри него.

Я получаю ошибку в заголовке во всех других настройках Destination на этапе сборки.

Также я попытался выйти из xcode, удалить каталог сборки, очистить и все такоетрюки.

Есть ли пропущенная настройка проекта / цели?Почему XCode ищет dynlib в «../lib/»?(как показано по ошибке)

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011

У вас есть два варианта: а) изменить идентификатор библиотеки, б) изменить конечный продукт.

Идентификатор встроен в dylib и определяет, где dyld будет его искать. Идентификатор берется из библиотеки во время соединения (когда другие специальные флаги не используются). Вы можете проверить это с помощью otool -L, например ::

gammu:~$ otool -L /usr/lib/libz.dylib 
/usr/lib/libz.dylib:
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)

Первая строка - это идентификатор dylib. Вы можете изменить его, используя install_name_tool -id <path> <library>. Один из вариантов, который у вас есть, это использовать специальную форму @executable_path/..., которая выглядит, начиная с местоположения вашего двоичного файла (есть и другие).

Второй вариант (достижение того же самого) - изменить путь к библиотеке в вашем продукте. Вы можете проверить, как он связывает библиотеки с помощью одной команды otool -L:

gammu:~$ otool -L /usr/bin/emacs
/usr/bin/emacs:
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)

Затем вы можете изменить библиотеки с помощью install_name_tool -change <old> <new> <target>, например ::

install_name_tool -change ../lib/abc.dynlib @executable_path/../lib/abc.dylib foo

Наконец, обратите внимание, что Xcode обычно делает все это для вас автоматически, если вы позволяете ему управлять dylib (вместо того, чтобы копировать его вручную).

2 голосов
/ 15 ноября 2012

У меня та же проблема, и я попробовал первое решение, первый вариант не работает.Один только второй вариант не может решить проблему.

Вместо этого в настройках Xode Build для dylib установите «Имя установки динамической библиотеки» на «<newpath>/<your.dylib>».Newpath - это путь, по которому может выглядеть ваш объектный файл foo, и по тому же пути вы сохраните свою библиотеку.После сборки dylib и использования его для построения вашего объектного файла эти пути будут автоматически вставлены в объектный файл.

Вы можете подтвердить с помощью otool -L для файла объекта и dylib.

0 голосов
/ 20 марта 2014

У меня была такая же проблема, и я решил ее следующим образом:

Найдите отсутствующий файл:

mdfind libz.1.dylib

Это было здесь: /Applications/Vagrant/embedded/lib/libz.1.dylib

Скопируйте его в отсутствующую папку с правами суперпользователя:

sudo sudo cp /Applications/Vagrant/embedded/lib/libz.1.dylib /usr/lib/libz.1.dylib

Готово, все работает как обычно.

...