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

有人可以解释一下这里发生了什么.如果我仅为项目构建选项中的链接器行为选择链接所有程序集或链接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"

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

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

转载注明原文:iphone – 链接器选项“仅链接所有程序集”和“仅链接SDK程序集”会在第三方静态库中导致未定义的符号 - 代码日志