2015-09-26 83 views
2

我很难配置一个iOS项目,它使用一个静态库链接到gcc使用的旧libstdC++。该库是32位和64位。在iOS项目中混合stdC++和libC++

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

因此,这里是我的问题:

1)有没有什么办法有项目中使用的libstdC++里面一个静态库,并有其他人使用的libC++?

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

3)有没有其他办法摆脱这个混乱?

回答

4

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

2)编译和链接时,可以使用'--stdlib = libstdC++'或'--stdlib = libC++'命令行参数指定要使用哪个C++库。如果最终的可执行文件需要与两者链接,则需要手动指定另一个(例如:--stdlib = libC++ -lstdC++)。 3)是的,但请注意,libstdC++在几年前不推荐使用,甚至在watchOS和tvOS上都不可用,所以最好的办法就是将所有东西都转换为libC++。

+0

谢谢。那是我正在寻找的答案。你知道是否存在一个命令行参数来链接一个库,然后只为这个库指定stl版本? – csotiriou

+0

编译单个源文件时,需指定您正在使用哪个C++运行时,编译器将为该运行时使用适当的STL。那就是在编译时使用--stdlib = libC++或--stdlib = libstdC++。在链接时,--stdlib = ...参数只是映射到适当的库链接;这就是为什么你需要在链接时手动指定另一个。 –

2

只要不混合对象(如将一个库中的字符串传递给需要不同类型字符串的函数),您可以在构建顶级应用程序时包含这两个库。

在我的情况下,它的工作方式是将标准C++ lib设置为GNU版本,然后像添加任何其他系统库一样添加libC++。