Как добавить сторонний проект Framework для 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

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

Спасибо

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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