Почему install_name_tool и otool необходимы для библиотек Mach-O в Mac Os X?

Я разрабатываю приложение Cocoa, используя последнюю версию Xcode 4, я хочу связать динамические библиотеки с моим проектом (dylibs).

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

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

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


person Alex    schedule 13.02.2012    source источник


Ответы (2)


У 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

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

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

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

person Willem Hengeveld    schedule 13.02.2012
comment
otool -L также полезен для отображения имен и общих библиотек (которые вы, возможно, захотите изменить с помощью install_name_tool. - person par; 22.02.2014
comment
Примечание: install_name_tool завершается автоматически; всегда дважды проверяйте, что он действительно сделал то, что вы ему сказали (используя 'otool -L ‹path_to_dylib›'. - person geowar; 12.05.2014
comment
Кажется, что атрибуты в dylib на самом деле не имеют значения. Они используются только при связывании исполняемого файла с dylib для копирования атрибутов из dylib в исполняемый файл. Для случая, когда у вас уже есть исполняемый файл, связанный с dylib, но вам нужно изменить пути, то достаточно отредактировать только исполняемый файл, чтобы установить LC_LOAD_DYLIB и, опционально, LC_RPATH. Второй нужен, только если в первом есть @rpath. - person v.shashenko; 05.07.2017
comment
Часть, которая спасла меня, была: Примечание: первый путь после -change должен точно соответствовать тому, что в данный момент находится в двоичном файле. Я не понял, что необходимо было указать полный путь, как он указан в дампе otool -L. в моем случае этот путь был /usr/local/lib/libcrypto.1.1.dylib, и он не работал, если бы я просто использовал libcrypto.1.1.dylib для этого параметра. - person M Katz; 23.09.2019

Существует также инструмент с графическим интерфейсом под названием MacDependency, который предоставляет доступ ко всем зависимым библиотекам (https://github.com/kwin/macdependency /).

person Konrad Windszus    schedule 25.07.2015