2011-05-09 8 views
1

У меня есть приложение monotouch, которое включает в себя статическую библиотеку цели-c. Приложение работает правильно на симуляторе, но когда я пытаюсь запустить приложение на своем iPhone 3GS, он падает при запуске. Это те шаги, которые я взял, чтобы попытаться получить его работу:Приложение со статической библиотекой работает на симуляторе, но не на самом устройстве

  • Составителя статической библиотеки в Xcode с устройства указанного и активной архитектурой набора на ARMv6 и в ARMv7 (я не уверен, что правильно , но я попробовал и то, и другое не работал).
  • Под информацией о проекте я установил код подписи с идентификатором на мой ключ разработчика.
  • В MonoDevelop я включил статическую библиотеку в настройках проекта приложения, установив дополнительные аргументы MonoTouch под iPhone построить иметь следующее значение (это идентично тому, что устанавливается для iPhoneSimulator):

    -v -v -v -gcc_flags "-lstdC++ -I $ {ProjectDir}/Ultralite/Include -L $ {ProjectDir}/Ultralite -lUltralite -force_load $ {ProjectDir} /Ultralite/libUltralite.a"

Когда я пытаюсь запустить приложение, он падает при запуске (с o экран приложения даже не отображается). В MonoDevelop все, что я вижу следующее сообщение об исключении:

Exception of type 'Mono.Debugger.Soft.VMDisconnectedException' was thrown. 

Все, что я вижу в журнале устройства в Xcode является следующее:

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x2fd00f24 

Если удалить -gcc_flags вариант из проекта , то приложение запускается, но с первой попытки пытается получить доступ к статической библиотеке. Таким образом, это определенно связано со статической библиотекой, которая приводит к сбою приложения при запуске.

Я понятия не имею, где даже начать с решения этого, и поэтому действительно нужна помощь в этом. Кто-нибудь получил какие-либо идеи относительно того, что не так со статической библиотекой, в которую я включаю, или знаю, где я могу получить больше информации о том, что происходит не так? Сообщение KERN_PROTECTION_FAILURE в отчете о сбое действительно не дает мне много работы.

Update: Я создал простое приложение Hello World, который имеет одну кнопку, которая при нажатии вызывает метод SayHello в статической библиотеке. Даже в этом базовом примере я столкнулся с той же проблемой; а именно, что он работает на симуляторе, но не на самом устройстве. Я загрузил свой пример helloworld в github. Я был бы очень признателен, если бы кто-то помог мне в этом. Вот пример Hello World:

https://github.com/BruceHill/HelloWorld

Это включает в себя папку для основного приложения, папки с Objective-C статическую библиотеку, а затем, наконец, папку для btouch определения. Я вызываю btouch с параметром -outdir =. для построения Messaging.g.cs и UltraliteManager.g.cs, которые затем включаю в приложение MonoTouch.

+0

Выписка из отчета о ДТП: Thread 0 Имя: очереди отправки: com.apple.main-нить Thread 0 Разбился: 0 Mobileforms \t 0x00fc0c1c mono_aot_get_class_from_name (АОТ-runtime.c: 1497) 1 Mobileforms \t 0x010225b0 mono_class_from_name (class.c: 7092) 2 Mobileforms \t 0x0103ce80 mono_exception_from_name_domain (exception.c: 58) 3 Mobileforms \t 0x0103ce38 mono_exception_from_name (exception.c: 35) 4 Mobileforms \t 0x0103d418 mono_get_exception_null_reference (exception.c: 280) – BruceHill

+0

Я теперь шаг ближе к решению этой проблемы. Мне удалось получить образец _Hello World_, изменив параметр _Linker behavior_ в настройках сборки из _Don't link_ в _Link SDK assemblysies only_. Однако, когда я делаю это изменение в реальном приложении, я получаю сообщение об ошибке «mtouch failed with no output», и в журнале сборки я вижу ошибки компоновщика, в которых указано, что символы не определены. Например, в нем указано, что «_SecRandomCopyBytes» и «_SecKeyGetBlockSize» в libUltralite.a не определены. – BruceHill

ответ

3

я должен был сделать два изменения, чтобы получить это работает правильно на Iphone:

  1. компоновщика поведение в вариантах сборки было необходимо иметь возможность Link все сборки набор.
  2. Мне пришлось добавить -framework Security в gcc_flags.

Так дополнительные аргументы MonoTouch под параметры сборки должны были иметь следующее значение:

-v -v -v -gcc_flags «-framework безопасности -lstdC++ -I $ {ProjectDir}/Ultralite/Включить -L $ {ProjectDir}/Ultralite -lUltralite -force_load $ {ProjectDir} /Ultralite/libUltralite.a»

причина мне пришлось добавить рамки безопасности является то, что она кажется MonoTouch включает эти рамки, когда не делать ссылка указана в вариантах сборки, но не включает ее, когда другие две опции s установлены. Я определил это, сравнив журналы построения для разных параметров.

0

Попробуйте добавить «-ObjC» к флагам компоновщика.

Обновление: Есть, по-видимому, некоторые проблемы, связанные с статическими либрациями. Вы также можете попробовать использовать флаг -all_load: What does the -all_load linker flag do?

+0

Спасибо, что ответили, Клаус. Я попытался добавить _-ObjC_, и это не имеет значения. Только чтобы указать на то, что моя статическая библиотека является оберткой вокруг библиотеки C++ и, следовательно, включение _-lstdC++ _ в флагов компоновщика. Что делает включение _ObjC_ в флаги? – BruceHill

+0

Существует подробное объяснение флага -ObjC в QA: http://developer.apple.com/library/mac/#qa/qa1490/_index.html –

+0

Я уже пробовал флаг -all_load и, к сожалению, это не помогло. :( – BruceHill

1

Открыть Организатор XCode. Подключите устройство. Затем посмотрите на аварии. Данные будут символизироваться, и вы, по крайней мере, увидите, в какой момент это не удалось.

+0

Спасибо, Ivink. Я даже убедился в том, что я вижу журнал сбоев в организаторе XCode. К сожалению, все перечисленные там символы, похоже, предполагают, что сбой происходит на моноуровне, поэтому ничего в журнале не имеет смысла для меня, но я сделал открытие относительно этой ошибки, выполнив тесты в своем примере Hello World. Кажется, эта ошибка имеет какое-то отношение к настройке _Linker behaviour_ в параметрах. См. мой последний комментарий к этому вопросу для получения более подробной информации. – BruceHill

1

У меня была аналогичная проблема с MonoTouch, связывающей стороннюю библиотеку через BTouch. Те же типы исключений и коды.

Вы должны получить исходный код этой сторонней библиотеки и скомпилировать ее с отключенным THUMB. XCode имеет этот параметр, просто выполните поиск THUMB в параметрах. libUltralite.a в конечном итоге будет немного больше по размеру.

+0

Спасибо, Мэтт. Я ранее сталкивался с проблемой с THUMB, и это отключено в моей библиотеке. Но я на шаг ближе к решению этого вопроса, см. Мой последний комментарий по этому вопросу. – BruceHill

Смежные вопросы