Параметры компоновщика «Связать все сборки» и «Связать только сборки SDK» вызывают неопределенные символы в статической библиотеке третьего производителя

#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.