2012-02-13 8 views
31

Я разрабатываю приложение Cocoa с использованием последней версии Xcode 4, я хочу связать динамические библиотеки с моим проектом (dylibs).Почему install_name_tool и otool необходимы для библиотек Mach-O в Mac Os X?

Я читал где-то, что добавления библиотек в моем проекте было недостаточно, поскольку мне нужно было запустить install_name_tool и otool, чтобы мой проект использовал библиотеки, которые были включены в мой проект.

Я прочитал страницы руководства для install_name_tool, но я не понимаю, ПОЧЕМУ я должен это делать.

Как работают библиотеки? Особенно заинтересованы в той части, где приложения и библиотеки имеют пути, указывающую на конкретные места в моей машине, как /usr/local/lib/mylibrary.dylib при запуске otool -L

ответ

51

Apple, есть несколько способов установочных разделяемых библиотек:

  1. @executable_path: по отношению к главный исполняемый
  2. @loader_path: по отношению к направляющему бинарного
  3. @rpath: по отношению к какой-либо из списка путей.

@rpath является самым последним дополнением, представленным в OS X 10.5.

Если, например, вы хотите иметь свой исполняемый файл в Contents/MacOS и библиотеки в Contents/Libraries вы можете сделать следующее:

install_name_tool -id @rpath/Libraries/lib_this.dylib builddir/lib_this.dylib 

и в исполняемом верхнего уровня набор rpath с:

install_name_tool -add_rpath @loader_path/.. myexecutable 

и:

install_name_tool -change builddir/lib_this.dylib @rpath/Libraries/lib_this.dylib myexecutable 

N ote: первый путь после -change должен соответствовать точно тому, что в настоящее время находится в двоичном формате.

Если вы потерялись otool -l -v myexecutable сообщит вам, какие команды нагрузки в настоящий момент находятся в исполняемом файле.

См. man dyld и man install_name_tool для получения дополнительной информации.

+0

'otool -L' также полезен для отображения имен и разделяемых библиотек (которые вы можете изменить с помощью' install_name_tool'. – par

+6

Примечание: install_name_tool терпит неудачу, всегда проверяйте, что это действительно то, что вы ему сказали (используя 'otool -L '. – geowar

+0

Кажется, что атрибуты в dylib действительно не имеют значения. Они используются только при связывании исполняемого файла с dylib для копирования атрибутов из dylib в исполняемый файл. Для случай, когда у вас уже есть исполняемый файл, связанный с dylib, но вам нужно изменить пути, тогда достаточно отредактировать только исполняемый файл, чтобы установить LC_LOAD_DYLIB и, возможно, LC_RPATH. Второй нужен, только если первый имеет @rpath в Это. –