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

时间:2011-05-10 10:27:09

标签: 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上崩溃。 (是的,我确实为实际设备重新编译了我的静态库...所以包含的库是针对正确的平台的。)

项目 build 选项下的其他mtouch参数如下:

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

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

3 个答案:

答案 0 :(得分:3)

我认为您的libUltralite.a实际上引用了一些您未与项目链接的其他库,即libUltralite.a具有依赖性。检查_SecRandomCopyBytes的实现位置(在驱动器上搜索标题或其他内容)以找出实际的“lib”.a您需要添加到链接器。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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