Xcode продолжает поиск dylib по неправильному пути

Это моя ошибка:

dyld: Library not loaded: /usr/local/lib/libofa.0.dylib
Referenced from: /sers/david/Projekte/Test/build/Debug/Test.app/Contents/MacOS/Test
Reason: image not found

Я провел небольшое исследование и изменил путь внутри dylib с помощью install_name_tool:

davids-macbook:Test david$ otool -L libofa.0.0.0.dylib 
libofa.0.0.0.dylib:
@executable_path/../Frameworks/libofa.0.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)

Но Xcode продолжает искать его в / usr / lib /:

build/Debug/Test.app/Contents/MacOS/Test:
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 15.0.0)
/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
@executable_path/../Frameworks/TagLib.framework/Versions/A/TagLib (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/QTKit.framework/Versions/A/QTKit (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
/System/Library/Frameworks/Quartz.framework/Versions/A/Quartz (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libcurl.4.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/local/lib/libofa.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 103.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 44.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.29.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 751.29.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1038.32.0)

Есть ли способ установить это в Xcode ??? Спасибо

Изменить: библиотека не является проектом Xcode. Его сборка с помощью ./configure; сделать


person david    schedule 02.02.2011    source источник
comment
Xcode не делает, компоновщик.   -  person    schedule 02.02.2011
comment
Есть ли способ указать Xcode сообщить компоновщику ..?   -  person david    schedule 04.02.2011


Ответы (3)


Обычно я делаю следующее:

  1. Установите Каталог установки библиотеки на @rpath. Это установит имя установки @rpath/libofa.0.0.0.dylib. Если вы создаете библиотеку самостоятельно, вы можете установить это в Xcode; в противном случае используйте install_name_tool, чтобы изменить его.
  2. Задайте Пути поиска Runpath приложения, использующего библиотеку, в расположение каталога, содержащего библиотеку. Например, если вы поместите библиотеку в каталог Frameworks приложения, для параметра Пути поиска пути установите значение @executable_path/../Frameworks (или @loader_path/../Frameworks).

Это сообщение в блоге и этот более подробно.

person mipadi    schedule 02.02.2011
comment
Похоже, это не работает. Тем не менее моя ошибка сохраняется. Я установил путь с помощью install_name_tool -id. Я попробовал install-name_tool -add_rpath. ничего не работает. Я попытался установить пути поиска Runpath и Runtime Search Paths на @loader_path /../ Frameworks По-прежнему его dyld: Библиотека не загружена: /usr/local/lib/libofa.0.dylib - person david; 04.02.2011
comment
Глупый я. У меня в проекте были какие-то дурацкие настройки включения. Спасибо! - person david; 04.02.2011
comment
Привет, Дэвид, у меня та же проблема, и я не могу понять, что вы имеете в виду под «глупыми настройками включения». Можете привести небольшой пример? - person JackPearse; 04.04.2013
comment
То же самое, также имея эту проблему, и НИКАКОЕ решение в Google не сказали мне, как это исправить. - person Geesu; 16.09.2013
comment
как установить каталог установки библиотеки с помощью install_name_tool? ни один из его вариантов не относится к каталогу установки ??? - person Motti Shneor; 04.01.2016
comment
@MottiShneor: Это вариант -id. - person mipadi; 04.01.2016
comment
Ой. Спасибо. теперь id означает каталог установки, а не просто ... ну ... id? Развлекайся с Apple. - person Motti Shneor; 05.01.2016
comment
@MottiShneor: Нет, это сокращение от идентификационного имени, как указано на странице руководства. - person mipadi; 05.01.2016
comment
Это исправило! ???? Для предварительно созданного фреймворка PGSQLKit в моем приложении OS X мне пришлось добавить скрипт этапа сборки install_name_tool -id @executable_path/../Frameworks/PGSQLKit.framework/PGSQLKit "$SRCROOT/PGSQLKit.framework/PGSQLKit" (замените имя вашего фреймворка соответствующим образом). Также обратите внимание, что мне также пришлось удалить пути поиска пути выполнения, отличные от @executable_path/../Frameworks, прежде чем он, наконец, заработал. - person Constantino Tsarouhas; 28.05.2016

Обязательно установите инструменты командной строки с сайта developer.apple.com, а затем добавьте библиотеку в свой проект. Запустите следующий скрипт в своем Xcode: Targets »Build Phases» Run Script и просто выполните:

install_name_tool -id @executable_path/../Frameworks/librayName.dylib "$SRCROOT/librayName.dylib"

Примечание: перед именем dylib требуется НЕТ 'или ""

person itechnician    schedule 08.10.2013
comment
Отличный совет! Кстати, для фреймворков вместо этого используйте install_name_tool -id @executable_path/../Frameworks/MyFramework.framework/MyFramework "$SRCROOT/MyFramework.framework/MyFramework" (где MyFramework - имя фреймворка). - person Constantino Tsarouhas; 28.05.2016

Прежде чем искать решение, вы должны знать, что нового в зависимой библиотеке «dylib» в MAC по сравнению с зависимой библиотекой «dll» в Windows.

Основное различие между dylib и dll - это "имя установки". Имя установки - это путь, запеченный в динамической библиотеке, в котором указано, где найти библиотеку во время выполнения. Неважно, куда вы копируете свои дилибы, он всегда будет указывать на старый путь (за исключением случаев без изменения имени установки). Вы можете узнать исходный путь поиска (имя установки), используя команду, как показано ниже

otool -L a.dylib

(просто перетащите dylib вместо a.dylib)

Дополнительные сведения об имени установки см. В этом ссылка.

Теперь решение для изменения нового местоположения для dylib («имя установки») - просто использовать install_name_tool, как показано ниже.

install_name_tool -change *old path of dylb* *new path of dylib*

вы можете получить старый путь с помощью команды otool -L, описанной выше. (старый путь, т.е. исходный путь)

install_name_tool -change также может изменить путь поиска dylib и исполняемого файла.

Вы можете использовать это в Xcode, написав Run script файл в вашем проекте.

person NIlesh Srivastava    schedule 29.10.2014