2014-02-11 5 views
0

У меня есть инструмент командной строки, который я создал с помощью Xcode, который связан с некоторыми фреймворками Apple.Mac OS X - привязка исполняемого файла к другой динамической библиотеке, загрузка как старых, так и новых

В качестве «личного эксперимента» (просто пытающегося понять, как работают динамические библиотеки) я попытался указать исполняемый файл на другую версию тех же фреймворков.

Допустим, например, что исполняемый EXEC использует LIB_A и последний использует LIB_B.

Я сделал копию как LIB_A и LIB_B размещения их в другой (короткий) путь к папке.

Я использовал otool -L для получения зависимостей и идентификаторов библиотек.

Затем я использовал install_name_tool с директивой -id изменить идентификаторы нового LIB_A и LIB_B (в основном только изменяя путь, ведущий в качестве имени не изменилось).

Затем с директивой -change Я позволяю новый LIB_A, чтобы указать на новый LIB_B и позволить исполняемым EXEC, чтобы указать на новый LIB_A.

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


install_name_tool не вернулся ошибок и проверки исполняемого файла и новые библиотеки с otool все они указывают на правильный путь.

К сожалению, исполняемый файл EXEC много ошибок передаются на консоль относительно дублирующего определения классов. Так же, как старые библиотеки и новые были загружены как.

Наконец, все аварии с Трассировка/BPT ловушку: 5

Например:

objc[25992]: Class NSAppleEventManager is implemented in both 
      /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation and 
      /xyz/Foundation. 
      One of the two will be used. Which one is undefined. 

Если я вызываю

export DYLD_PRINT_LIBRARIES=1 

я вижу в исполнении, что на самом деле библиотеки загружаются в два раза ,

ответ

0

Я на самом деле решается вопрос зверски установив

export DYLD_LIBRARY_PATH= 

, который работал на моей конкретной ситуации.