Xcode продолжает поиск dylib по неверному пути - PullRequest
13 голосов
/ 02 февраля 2011

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

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

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

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; сделать

Ответы [ 3 ]

21 голосов
/ 02 февраля 2011

Обычно я делаю так:

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

В этом блоге и в этом подробнее.

7 голосов
/ 08 октября 2013

Обязательно установите инструменты командной строки с developer.apple.com, а затем добавьте библиотеку в свой проект. Запустите следующий скрипт в вашем Xcode: Цели »Фазы сборки» Выполнить скрипт и просто выполните:

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

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

3 голосов
/ 29 октября 2014

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

Основное отличие в dylib vs 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.

...