在 iOS 项目中混合使用 stdc++ 和 libc++

Mixing stdc++ and libc++ in an iOS project

我在配置 iOS 项目时遇到困难,该项目使用链接到 gcc 使用的旧 libstdc++ 的静态库。该库是 32 位和 64 位的。

有 6 个库(例如 libssl.a)是 32 位的,必须更新。如果我从源代码编译这些库,它们将自动与 libc++ 链接,这将导致我的链接器报错。

因此,这是我的问题:

1) 有什么方法可以让项目中的单个静态库使用 libstdc++,而让其他的使用 libc++?

2) 如何从源代码编译库(如 libcrypto 和 libssh)并强制它们使用旧的 libstdc++ 标准库?

3) 还有其他方法可以解决这个问题吗?

只要您不混合对象(例如将字符串从一个库传递到需要不同类型字符串的函数),您就可以在构建顶级应用程序时通过包含这两个库来实现.

就我而言,它的工作原理是将标准 C++ 库设置为 GNU 版本,然后像添加任何其他系统库一样添加 libc++。

1) 是的,您当然可以混合和匹配您的 C++ 代码使用的 C++ 运行时,只要这些单独的模块实际上不在彼此之间传递对象即可。例如,如果您的应用程序中有两个模块,它们只公开 C API 但在内部使用 C++,那么每个模块都可以使用它们想要的任何 C++ 运行时。尝试在运行时之间共享对象时出现问题。

2) 您可以在编译时使用“--stdlib=libstdc++”或“--stdlib=libc++”命令行参数,并linking 指定要使用的C++ 库。如果您的最终可执行文件需要针对两者 link,则您需要手动指定另一个(例如:--stdlib=libc++ -lstdc++)。

3) 是的,但请注意,libstdc++ 多年前就已被弃用,甚至在 watchOS 和 tvOS 上都不可用,因此最好的选择是将所有内容都转移到 libc++。