Xcode 5, как связать динамические библиотеки из пакета приложений

Я хочу распространить некоторые библиотеки в свой пакет приложений OS X, последние два дня я работаю над этим, но не смог этого сделать. до сих пор, что я сделал.

с помощью инструмента имени установки у меня есть фиксированные пути к библиотеке. Кроме того, со временем я попробовал @loader_path/../Libraries и @executable_path/../Libraries.

otool -L libMagickWand-6.Q16.2.dylib 
@rpath/../Libraries/libMagickWand-6.Q16.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    @rpath/../Libraries/libMagickCore-6.Q16.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    @rpath/../Libraries/libfreetype.6.dylib (compatibility version 18.0.0, current version 18.2.0)
    @rpath/../Libraries/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.5)
    @rpath/../Libraries/libz.1.2.5.dylib (compatibility version 1.0.0, current version 1.2.5)
    @rpath/../Libraries/libltdl.7.dylib (compatibility version 11.0.0, current version 11.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

в целях проекта/Фазы сборки/Добавить новую фазу сборки/Добавить фазу сборки файлов копирования и скопировал все динамические библиотеки в мой пакет приложений.

введите здесь описание изображения

это сработало хорошо, я вижу, что библиотеки находятся в комплекте приложений.

введите здесь описание изображения

затем добавьте @rpath/../Libraries/ в Build Settings/Runpath Search Paths

введите здесь описание изображения

но все равно получаю сообщение об ошибке..

ld: не найдена библиотека для -lMagickWand-6.Q16.2 clang: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте -v, чтобы увидеть вызов)

если я добавлю прямой путь, скажем, библиотеки находятся в /User/username/libs/ в пути поиска библиотек в настройках сборки, это работает.

введите здесь описание изображения

я что-то пропустил?


person mohacs    schedule 17.05.2014    source источник


Ответы (1)


Content/Libraries не является стандартным каталогом в комплекте приложений; вместо этого используйте Content/Frameworks (.dylib разрешены в этом каталоге точно так же, как .framework).

Задайте для Имя установки каждой библиотеки значение @rpath/libWhatever.dylib, а для параметра Путь поиска исполняемого файла (в Contents/MacOS) установите значение @loader_path/../Frameworks.

Для взаимозависимостей библиотек Путь поиска Runpath должен быть просто @loader_path, чтобы зависимые библиотеки можно было загружать из одного и того же каталога.

person trojanfoe    schedule 17.05.2014
comment
Вы имеете в виду, что путь к библиотеке должен быть @rpath/libMagickCore-6.Q16.2.dylib, а для того же пути к зависимостям библиотеки должен быть такой путь @loader_path/../Frameworks/a.dependency.dylib? прошу прощения немного запутался. - person mohacs; 17.05.2014
comment
@mohacs Имя установки всех библиотек должно быть @rpath/$(EXECUTABLE_PATH) при сборке в Xcode или @rpath/libWhatever.dylib при изменении с помощью install_name_tool. Думайте о @rpath так же, как $PATH для исполняемых файлов в командной строке; он просто сообщает загрузчику, где найти библиотеки, которые он ищет. - person trojanfoe; 17.05.2014
comment
спасибо, теперь в основном не выдается ошибка, говорящая о том, что библиотека не найдена (нет библиотек тестовой машины), однако даже на машине разработки, когда я помещаю @loader_path/../Frameworks в пути поиска путей запуска, вызывая какие-либо библиотечные методы, ничего не делает. если я удалю путь запуска и добавлю пути библиотеки к обычным путям поиска библиотеки, это сработает. все же я что-то упускаю. должен ли я всегда сохранять обычный путь поиска библиотеки /Users/username/Desktop/lib2. иначе он не скомпилируется. мне нужно добавить флаг или что-то в этом роде? - person mohacs; 17.05.2014
comment
хорошо, ваше решение на 100% правильное, оно не сработало в первую очередь, но я понял, что были проблемы с библиотеками, которые я ранее скомпилировал. перекомпилировал библиотеки и работал как шарм. все библиотеки, размещенные в ../Frameworks, и приложение работают на каждом компьютере. спасибо еще раз. - person mohacs; 18.05.2014
comment
Сверху в ответе, где написано Content/Frameworks? Все документы Apple относятся к Contents/Frameworks. - person Arch D. Robison; 25.11.2015
comment
@trojanfoe, что бы вы сделали в этом случае: stackoverflow.com/questions/40318465/? Спасибо. - person Royi; 29.10.2016