Приложение со статической библиотекой запускается на симуляторе, но не на реальном устройстве - PullRequest
1 голос
/ 09 мая 2011

У меня есть приложение Monotouch, которое включает в себя статическую библиотеку Objective-C. Приложение корректно работает на симуляторе, но при попытке запустить приложение на моем iPhone 3GS оно вылетает при запуске. Вот шаги, которые я предпринял, чтобы попытаться заставить его работать:

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

    -v -v -v -gcc_flags "-lstdc ++ -I $ {ProjectDir} / Ultralite / Включить -L $ {ProjectDir} / Ultralite -lUltralite -force_load $ {ProjectDir} /Ultralite/libUltralite.a"

Когда я пытаюсь запустить приложение, оно вылетает при запуске (поэтому экран приложения даже не появляется). В 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 в отчете о сбое действительно не дает мне много работы.

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

https://github.com/BruceHill/HelloWorld

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

Ответы [ 4 ]

3 голосов
/ 12 мая 2011

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

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

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

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

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

1 голос
/ 10 мая 2011

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

1 голос
/ 10 мая 2011

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

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

0 голосов
/ 09 мая 2011

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

Обновление: Кажется, есть некоторые проблемы, связанные со статическими библиотеками.Вы также можете попробовать использовать флаг -all_load: Что делает флаг компоновщика -all_load?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...