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

时间:2015-09-26 07:09:40

标签: ios xcode static-libraries libstdc++ libc++

我很难配置iOS项目,该项目使用与gcc使用的旧libstdc ++链接的静态库。该库是32位和64位。

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

因此,这是我的问题:

1)有没有办法让项目中的单个静态库使用libstdc ++,让其他人使用libc ++?

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

3)还有其他方法可以解决这个混乱局面吗?

2 个答案:

答案 0 :(得分:5)

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

2)你可以使用' - stdlib = libstdc ++'或者' - stdlib = libc ++'编译和链接时命令行参数指定要使用的C ++库。如果您的最终可执行文件需要链接到两者,则您需要手动指定另一个(例如: - stdlib = libc ++ -lstdc ++)。

3)是的,但请注意libstdc ++在几年前已被弃用,甚至在watchOS和tvOS上都没有,所以最好的办法是将所有内容都放到libc ++上。

答案 1 :(得分:2)

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

在我的例子中,它通过将标准C ++ lib设置为GNU版本然后像任何其他系统库一样添加libc ++来工作。