#iphone #ios4 #xamarin.ios
#iPhone #ios4 #xamarin.ios
Вопрос:
Может кто-нибудь, пожалуйста, объяснить, что здесь происходит. Если я выберу Связать все сборки или связать только сборки SDK для поведения компоновщика в параметрах сборки проекта, то я получаю следующие ошибки компоновки, возникающие в моей статической библиотеке libUltralite.a.
Undefined symbols:
"_SecRandomCopyBytes", referenced from:
_zcbdb539311e3 in libUltralite.a(03b1278799.o)
"_SecTrustSetAnchorCertificates", referenced from:
zda160c9852f6::z41eb5883fa2f(__CFArray const*) in libUltralite.a(fb6da25cb9.o)
"_SecKeyGetBlockSize", referenced from:
_zd0743c47573a in libUltralite.a(f43c4e48ce.o)
"_SecCertificateCopySubjectSummary", referenced from:
zda160c9852f6::z41eb5883fa2f(__CFArray const*) in libUltralite.a(fb6da25cb9.o)
"_SecPolicyCreateSSL", referenced from:
zda160c9852f6::z41eb5883fa2f(__CFArray const*) in libUltralite.a(fb6da25cb9.o)
"_SecTrustCopyPublicKey", referenced from:
_z2cfcc7397b7e in libUltralite.a(f43c4e48ce.o)
"_SecTrustCreateWithCertificates", referenced from:
zda160c9852f6::z41eb5883fa2f(__CFArray const*) in libUltralite.a(fb6da25cb9.o)
_z2cfcc7397b7e in libUltralite.a(f43c4e48ce.o)
"_SecCertificateCreateWithData", referenced from:
zda160c9852f6::z635831b310af(unsigned char*, unsigned long)in libUltralite.a(fb6da25cb9.o)
_z2cfcc7397b7e in libUltralite.a(f43c4e48ce.o)
"_kSecRandomDefault", referenced from:
_kSecRandomDefault$non_lazy_ptr in libUltralite.a(03b1278799.o)
(maybe you meant: _kSecRandomDefault$non_lazy_ptr)
"_SecKeyEncrypt", referenced from:
_zb27eee72717c in libUltralite.a(f43c4e48ce.o)
"_SecPolicyCreateBasicX509", referenced from:
_z2cfcc7397b7e in libUltralite.a(f43c4e48ce.o)
"_SecTrustEvaluate", referenced from:
zda160c9852f6::z41eb5883fa2f(__CFArray const*) in libUltralite.a(fb6da25cb9.o)
_z2cfcc7397b7e in libUltralite.a(f43c4e48ce.o)
Если вместо этого я выбрал Не связывать для поведения компоновщика, то связывание работает и не выдает никаких ошибок, но приложение вылетает при запуске на реальном iphone. Приложение не вылетает на симуляторе, оно вылетает только на реальном iphone. (Да, я перекомпилировал свою статическую библиотеку для реального устройства… таким образом, включаемая библиотека предназначена для правильной платформы).
Мои дополнительные аргументы mtouch в параметрах сборки проекта следующие:
-v -v -v -gcc_flags "-lstdc -I${ProjectDir}/Ultralite/Include -L${ProjectDir}/Ultralite -lUltralite -force_load ${ProjectDir}/Ultralite/libUltralite.a"
Я сделал вывод из простой пример, что есть некоторые подробности корректно работает на симуляторе и на реальном устройстве с компоновщиком поведение установить по ссылке СДК только сборки, но мне нужно выяснить, почему привязка к моей статической библиотеки не работает корректно с этой опцией. Если бы кто-нибудь мог пролить некоторый свет на ошибки компоновки, которые я получаю, или предложить обходной путь для правильной компоновки моего приложения с помощью этого набора параметров поведения компоновщика, я был бы очень благодарен.
Ответ №1:
Я думаю, что ваш libUltralite.фактически a ссылается на какую-то другую библиотеку, которую вы не связываете с проектом, т. Е. libUltralite.у a есть зависимость. Проверьте, где реализован _SecRandomCopyBytes (выполните поиск на диске по заголовку или чему-то еще), чтобы узнать фактическую «библиотеку».a, который вам нужно добавить в компоновщик.
Комментарии:
1. Спасибо, Павел за ваш ответ. Я думаю, что ваш ответ на правильном пути. Какая-то библиотека явно отсутствует, если для параметра » Поведение компоновщика » не установлено значение » Не связывать «. Я собираюсь изучить различия в журнале сборки, чтобы посмотреть, смогу ли я определить, чего не хватает при изменении этого параметра сборки.
2. Вы были правы в отношении отсутствия зависимости. Оказывается, что libUltralite. a зависит от платформы безопасности. Похоже, что при поведении компоновщика , установленном на Не связывать , этот фреймворк включается MonoTouch, но при двух других параметрах поведения компоновщика этого не происходит. Итак, решением было добавить параметр -framework Security к gcc_flags. Теперь библиотека становится корректно связанной для всех параметров поведения компоновщика. Спасибо за вашу помощь в этом, Павел.
Ответ №2:
Я столкнулся с аналогичной проблемой с RestKit, но вы можете просто добавить Security.framework в свой проект / цель. (вам не нужно добавлять флаг вручную) — ну, это если вы используете XCode. Если вы используете компиляцию из командной строки, да, вам нужна -framework Security.
Ответ №3:
Возможно, вам придется скомпилировать стороннюю программу с той же версией monotouch.
Комментарии:
1. Библиотека третьего производителя является библиотекой objective-c, поэтому она скомпилирована с помощью Xcode.