【问题标题】:Linker options 'Link all assemblies" and "Link SDK assemblies only" causes undefined symbols in 3rd party static library链接器选项“链接所有程序集”和“仅链接 SDK 程序集”导致第 3 方静态库中的符号未定义
【发布时间】:2012-04-06 07:38:28
【问题描述】:

谁能解释一下这里发生了什么。如果我在项目构建选项中为链接器行为选择链接所有程序集仅链接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 上崩溃。 (是的,我确实为实际设备重新编译了我的静态库...所以所包含的库适用于正确的平台)。

我的additional mtouch arguments项目下build选项如下:

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

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

【问题讨论】:

    标签: iphone ios4 xamarin.ios


    【解决方案1】:

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

    【讨论】:

    • 感谢帕维尔的回复。我认为你的答案是正确的。当 链接器行为 选项未在 不链接 上设置时,某些库明显丢失。我将探索构建日志中的差异,看看我是否可以在更改此构建选项时确定缺少什么。
    • 您对缺少依赖项是正确的。事实证明,libUltralite.a 依赖于安全框架。似乎在将 linker behavior 设置为 Don't link 时,MonoTouch 会包含此框架,但使用其他两个 linker behavior 选项它没有。因此解决方案是将设置 -framework Security 添加到 gcc_flags。现在,所有 链接器行为 选项的库都已正确链接。谢谢你的帮助,帕维尔。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 第三方库是objective-c库,所以是用Xcode编译的。
      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多