【问题标题】:iPhone: Using static library in an application crashes the device but not the iphone simulatoriPhone:在应用程序中使用静态库会导致设备崩溃,但不会导致 iphone 模拟器崩溃
【发布时间】:2009-10-10 16:49:57
【问题描述】:

我制作了一个库,现在我想在应用程序中使用它。我相信我已经正确链接到图书馆。以下是我做过的所有事情:

  • 设置标题搜索路径
  • 将其他链接器标志设置为“-ObjC”
  • 添加了静态库 xcode 项目
  • 确保 lib.a 被列为框架目标
  • 将库添加为直接依赖项

正如我在标题中所说,我已经在模拟器中成功运行了带有静态库的应用程序。一旦我尝试使用设备测试应用程序,它就会在必须使用库中的函数的第二秒崩溃:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSDate firstOfCurrentMonth]: unrecognized selector sent to class 0x3841bb44'
2009-10-10 12:45:31.159 Basement[2372:207] Stack:

【问题讨论】:

    标签: iphone objective-c cocoa-touch xcode xcodebuild


    【解决方案1】:

    这是由于当前 SDK 链接器中的错误造成的。有关问题和可能的解决方法的更多信息,请参阅this post。 (另见this post。)

    更新:

    您可以尝试的另一件事是删除静态库并将库的源文件直接包含在应用程序的项目中。我遇到了类似的静态库链接问题,这就是我最终依靠它成功运行的原因。如果这有效(无论它可能是一种严重的解决方法),那么它肯定是一个链接器问题。

    【讨论】:

    • 我试过了,它似乎没有帮助...我将它添加到应用程序,然后是库。
    • 如第二个链接中所述,您可能需要在构建设置中的其他链接器标志中添加“-all_load”选项,以从静态库中获取类别以正确链接。这是 iPhone OS 3.0 SDK 的一个已知问题。
    【解决方案2】:

    我最近遇到了这个问题。当我注意到另一个类别我有 DID 工作时,我无法让 -all_load 工作。我对这个类别很懒惰,并将其包含在另一个文件中。

    我最终创建了一个虚拟类(没有方法、实例变量)并将我的类别的实现包含在该虚拟类的 .m 文件中。这样做之后,即使我删除了 -all_load 标志,我的类别也开始工作了。

    这是在 iPhone OS 3.1.3 上。

    这当然不是修复它的正确方法,但它似乎有效。

    完整的示例代码在我的blog 上,用于我的(琐碎)类别。

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 1970-01-01
      • 2011-09-24
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多