防止使用低于最低部署目标的SDK构建应用程序

6
我创建了一个静态库,部署目标为iOS 10.2。该库已集成到一个部署目标为9.0的应用程序中。
一些奇怪的地方是,该应用程序在iOS 9.0上构建和运行都很好。这是为什么? 即使库只针对iOS 10.2及以上版本,应用程序也应该能够构建吗?

有趣的问题。 - Fattie
1个回答

8

是的,如果您的应用程序的基本SDK等于或高于静态库的部署目标,则您的构建将在没有错误的情况下编译。

静态库在内部是一堆已编译的对象。在您的应用程序编译后,在链接时,它会检查静态库中使用的符号的可用性。如果您的项目的基本SDK等于或高于静态库的部署目标,则您的项目将找到库中使用的所有符号的定义——因此没有编译器错误

在运行时,如果您在版本低于静态库的部署目标并且使用了该版本中不可用的符号,则可能会出现错误。

如果您的代码/库使用符号:

  1. 如果在主项目的基本SDK中未定义(例如,库中的较新OS的符号),则会出现编译时错误。
  2. 如果在基本SDK中定义但标记为弃用,则会出现编译时警告。
  3. 如果在部署目标中定义,则您的代码链接和构建正常。在运行时:

    • 在运行早于部署目标的操作系统的系统上,如果使用该操作系统中不可用的符号,则您的代码可能无法加载。
    • 在运行等于或晚于部署目标的操作系统的系统上,您的代码对于不可用于该操作系统的符号具有空指针。

来源:developer.apple.com

这是来自上述链接的图像,说明可以根据部署目标和基本SDK使用哪些符号 Image from above link, explaining what symbols you can use depending on deployment target and base sdk.


嗯,这正是我担心的。虽然有道理,但我希望有一种方法来实现我想做的事情。谢谢! - Titouan de Bailleul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接