在iOS库中的C++运行时兼容性问题

8

我需要分发一个闭源库(以动态.framework形式呈现),该库在模块边界处使用C++内部,并公开Objective-C API。这个库将被许多客户在他们的应用程序中使用。

据我所知,默认情况下,C++运行时通过libc++.dylib进行动态链接。因此问题是:运行时在iOS版本/编译器版本之间兼容吗?当使用我的库时,我的客户是否会遇到二进制兼容性问题(例如,操作系统使用不同的运行时版本,在我的库中产生微妙的错误)?

附带说明(关于这个问题的来源):在Windows上,如果您想确保二进制文件在所有系统上都能正常工作而无需提供特定版本的运行时组件,则通常需要静态链接C++运行时。因此,我想知道在iOS上是否存在同样的问题。

3个回答

3
只有苹果知道哪些C++库不再受支持和何时停止支持。我猜想,依赖于不再受支持的运行时的应用程序将完全停止工作或者根本无法使用你的库进行构建。我在这里找到了这个信息(Xcode 10 (iOS 12) does not contain libstdc++6.0.9),表明随着时间的推移,对较旧运行时的支持可能会被取消,那么你就需要构建另一个库。
从过去的经验来看,我们有一个应用程序 - 我知道,不完全相同于库 - 在App Store中具有C++核心和Objective-C外壳,并且不关心C++运行时兼容性。这从未成为问题。而是偶尔会出现一些轻微的用户界面问题需要解决(我认为是iOS7 - 好吧,你可能没有用户界面),然后强制转移到64位,然后是某些API更改,其中Apple希望以这样或那样的方式处理...当出现问题时,我们会使用最新版本的XCode进行构建,这有助于保持事情运行,但旧版本仍然可以继续工作。
总之,你需要准备好维护你的库,也许在C++运行时成为问题之前可能会有其他事情“出乎意料”,那么你就只需要为客户做另一个构建。

你提到的对旧版libstdc++的支持已经被放弃,只会影响到新应用或者是应用的新版本的开发。它不会影响到App Store或设备上未更改的应用。 - Codo
同意。如果苹果在很长一段时间后(5年?10年?)完全放弃了设备支持,这并不是难以理解的,而且可以合理地期望维护的应用程序偶尔重新构建。 - J.R.

3
过去的新iOS版本与现有应用程序具有极佳的兼容性。如果一个应用程序是为旧版iOS构建的,它也会在新的iOS版本上运行。苹果似乎会模拟旧的iOS版本,包括其视觉风格和怪癖。如果您运行为iOS 6或更早版本构建的应用程序,它仍将具有灰色外观,而不是iOS 7引入的新样式。
一旦应用程序更新,情况就不同了:你需要使用最新的Xcode,新规则适用,并且许多旧特性将被废弃。作为其中的一部分,苹果可能会删除API,切换到新的C++编译器,更改标准的C和C++库等。
因此:
- 在App Store中发布的应用程序应该能够在很多年后继续使用您的C++库。 - 然而,对于开发新应用程序或现有应用程序的新版本,您需要定期检查您的库的兼容性,并可能提供更新版本。

3

如果您使用的是系统级别的libc++.dylib库,则任何应用程序都可以使用它。因此,按照定义,谁提供这个库(苹果公司)就有责任维护该库的向后二进制兼容性。如果兼容性被破坏了,将会导致成千上万个应用程序损坏。

另一方面,如果您正在使用某个自定义版本的该库,则应该将其与*.framework一起提供。在这种情况下,不会存在破坏兼容性的风险,因为它是与框架一起提供的。

因此,基本上您不必担心这个问题。如果出现问题,将会有很多应用程序受到影响。


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