我需要分发一个闭源库(以动态.framework
的形式),该库在内部使用C ++,并在模块边界处公开Objective-C API。该库将被众多客户端的应用程序使用。
据我了解,默认情况下,C ++运行时是通过libc++.dylib
动态链接的。所以问题是:iOS发行版/编译器版本之间的运行时兼容吗?使用我的库时,我的客户端能否遇到二进制兼容性问题(例如,操作系统附带的运行时版本不同,在我的库中产生细微的错误)?
侧面注解(关于此问题的出处):在Windows上,如果要确保二进制文件在所有系统上都可以运行而又不需要附带特定的东西,则通常需要静态链接C ++运行时。版本运行时组件。所以我想知道iOS上是否存在相同的问题。
答案 0 :(得分:3)
只有Apple知道是否或何时不再支持某些C ++库。我的猜测是,取决于不再受支持的运行时的应用程序将完全停止运行,或者首先不会与您的库一起构建。我在这里(Xcode 10 (iOS 12) does not contain libstdc++6.0.9)找到了该信息,表明多年来,对较早运行时的支持可能会下降,然后您需要构建另一个库。
从过去的经验来看,我们在App Store中有一个应用程序-我知道,它与库并不完全相同-具有C ++核心和Objective-C填充,并且不关心C ++运行时兼容性。从来没有成为问题。取而代之的是,不时地(经过几年和iOS迭代)需要解决一些轻微的用户界面问题(我认为使用iOS7-好的,您可能没有UI),然后强制迁移到64位,然后一些API发生了变化,Apple会以某种方式希望它们出现问题。当出现问题时,我们使用最新的XCode进行了构建,这将有助于保持事物的正常运行,但是旧版本仍然可以正常工作。
结果是,在C ++运行时成为问题之前,您需要做好维护库的准备,也许还有其他的“建议”,然后您只需要为客户进行另一次构建即可。
答案 1 :(得分:3)
过去,新的iOS版本提供了与现有应用程序的出色兼容性。如果应用是为旧的iOS版本构建的,则它也可以在新的iOS版本上运行。苹果似乎模拟了旧的iOS版本-包括其视觉样式和怪癖。如果您运行的是专为iOS 6或更早版本而构建的应用,则该应用仍将具有灰色外观,而不是iOS 7引入的新样式。
应用程序更新后,情况就大不一样了:您将需要使用最新的Xcode,将应用新规则,并且许多旧功能将被停用。为此,Apple可能会删除API,切换到新的C ++编译器,更改标准的C和C ++库等。
所以:
答案 2 :(得分:3)
如果您正在使用libc++.dylib
,它是系统范围的库,则任何应用程序都可以使用它。
因此,根据定义,提供此库的人(苹果公司)负责维护该库的向后二进制兼容性。
如果兼容性被破坏,数千个应用程序将被破坏。
另一方面,如果您正在使用该库的某些自定义版本,则应随*.framework
一起提供。在这种情况下,因为框架随附了兼容性,所以没有破坏兼容性的风险。
因此,基本上没有理由让您担心。 如果某个东西被破坏了,那么很多应用程序将被破坏。