Iphone 链接器选项“链接所有程序集”和“仅链接SDK程序集”会导致第三方静态库中出现未定义的符号

Iphone 链接器选项“链接所有程序集”和“仅链接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: zd

有人能解释一下这里发生了什么吗?如果我在项目构建选项中选择“链接所有程序集”或“仅链接链接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上崩溃。是的,我确实为实际设备重新编译了静态库……因此包含了库ed代表正确的平台

我在项目构建选项下的其他mtouch参数如下:

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

我从一个简单的例子中得出结论,MonoTouch在模拟器和实际设备上正确工作,链接器行为仅设置在Link SDK程序集上,但我需要找出为什么链接到我的静态库在使用此选项集时无法正常工作。如果有人能够解释我遇到的链接错误g或建议一种解决方法,以使我的应用程序正确链接到此链接器行为选项集,我将不胜感激。

我认为您的libUltralite.a实际上引用了您未链接到项目的其他库,即libUltralite.a具有依赖性。请检查_SecRandomCopyBytes在何处实现在驱动器上搜索标题或其他内容,找出需要添加到链接器中的实际lib.a。

可能您必须使用相同版本的monotouch编译第三方。

我在RestKit中遇到了类似的问题-但是您可以简单地将Security.framework添加到项目/目标中。您不需要添加标志手册很好,如果您使用的是XCode。如果您使用的是命令行编译,是的,您需要-framework Security。

第三方库是objective-c库,因此它是使用XCode编译的。感谢Pavel的回复。我认为您的答案是正确的。当链接器行为选项不是s时,显然缺少一些库et on Don't link。我将探索构建日志中的差异,看看在更改此构建选项时是否可以确定缺少了什么。您关于缺少依赖项的说法是正确的。结果表明,libUltralite.a依赖于安全框架。似乎当链接器行为设置为Don't link时,此框架gMonoTouch包含ets,但其他两个链接器行为选项则不包含ets。因此,解决方案是将设置-框架安全性添加到gcc_标志中。现在,所有链接器行为选项的库都已正确链接。感谢您的帮助,Pavel。