Как добавить сторонний фреймворк в проект iPhone?

Я пытаюсь использовать инфраструктуру PLDatabase в своем приложении для iPhone. Я добавил фреймворк в свой проект Xcode. Однако, когда я запускаю свое приложение, оно вылетает со следующей ошибкой:

dyld: Library not loaded: @loader_path/../Frameworks/PlausibleDatabase.framework/Versions/A/PlausibleDatabase
  Referenced from: /Users/todd/Library/Application Support/iPhone Simulator/User/Applications/BB3C66B2-A5BB-4329-B163-AB0072411AF1/Congress.app/Congress
  Reason: image not found

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

Спасибо


person talanb    schedule 03.02.2009    source источник


Ответы (3)


iPhone не поддерживает динамическое связывание встроенных платформ. Хотя вы можете заставить симулятор работать, он не будет работать на устройстве. Если вы хотите использовать код, вы должны создать статическую библиотеку для фреймворка (libpldatabase.a), а затем связать их с приложением.

Графический интерфейс Xcode не предоставляет удобного интерфейса для статической компоновки, вам нужно будет добавить соответствующие флаги в ваши настройки сборки (-lpldatabase -L/whatever/dir/it/is/in).

person Louis Gerbarg    schedule 03.02.2009

На самом деле не совсем верно, что iPhone не поддерживает динамическое связывание. Что правда, так это то, что приложения, установленные в App Store, не могут динамически связываться.

Магазин приложений / ituned устанавливает программы в каталог /private/var/mobile/.... Любая открытая программа, находящаяся в этом подкаталоге, chroot и лишена определенных прав при открытии. Процессы с chroot не могут разветвляться, они не могут работать в фоновом режиме, они не могут загружать динамические библиотеки и не могут сохранять файлы за пределами своих небольших защищенных областей диска (за исключением фотографий в каталоге фотографий). ).

Тем не менее, iPhone работает под управлением современной операционной системы, которая прекрасно поддерживает динамическую компоновку. Акт «взлома» на самом деле представляет собой установку программы за пределами chroot-тюрьмы, которая затем может делать такие вещи, как разветвление и сохранение файлов в других местах на диске и загрузка динамического кода.

Apple (и открытое сообщество iPhone) имеет множество программ, работающих на телефоне (например, приложения MobilePhone, Mobile Safari и SpringBoard), которые могут работать в фоновом режиме и загружать библиотеки. Они размещаются в другом месте на диске (часто /private/var/stash/Applications).

Итак... если вы хотите продавать свое приложение в магазине приложений, вы не можете загружать динамическую библиотеку. Что для большинства людей означает, что вы вообще не можете его загрузить. Но если вы хотите распространять свое приложение через cydia (распространенный установщик приложений для телефона с джейлбрейком), то вы можете обойтись без джейлбрейка телефона и загрузки динамической библиотеки. Фактически, из-за того, что процесс установки itunes является виновником, как вы узнали, вы даже не можете загрузить dylib из своего собственного приложения, которое вы пишете на свой телефон... если только вы не сделаете джейлбрейк.

person Aftermathew    schedule 21.02.2009

RE @mipadi: ZeroLink был удален в Xcode 3.1 и не существует для iPhone SDK. Правильный ответ - Луи; iPhone не поддерживает динамически загружаемые фреймворки в приложениях, созданных разработчиками.

Xcode имеет хороший пользовательский интерфейс для статических библиотек; просто перетащите их в проект, и они будут добавлены на этапе ссылки. Не нужно возиться с флагами компоновщика. Проблема возникает, когда вам нужно использовать заголовки, поставляемые с этими статическими библиотеками (тогда вам нужно добавить пути поиска заголовков вручную) или когда статическая библиотека конфликтует с доступной dylib (вот когда вам нужно добавить флаг -l вручную) .

person cdespinosa    schedule 04.02.2009