2011-12-28 4 views
1

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

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

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

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

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

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

ответ

3

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

ID встроен в 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 (вместо копирования вручную).

+0

Я не создал dynlib, поэтому я не могу интегрироваться в Xcode. второй работает. благодаря! – yzucker

2

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

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

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

0

У меня была такая же проблема и решена таким образом:

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

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 

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

Смежные вопросы