混合stdc&x2B+;和libc++;在iOS项目中

混合stdc&x2B+;和libc++;在iOS项目中,ios,xcode,static-libraries,libstdc++,libc++,Ios,Xcode,Static Libraries,Libstdc++,Libc++,我在配置一个iOS项目时遇到了困难,该项目使用了一个与gcc使用的旧libstdc++链接的静态库。该库是32位和64位的 有6个库(例如libssl.a)是32位的,必须更新。如果我从源代码处编译这些库,它们将自动与libc++链接,这将导致我的链接器抱怨 因此,我的问题如下: 1) 有没有办法让项目中的单个静态库使用libstdc++,而让其他库使用libc++ 2) 如何从源代码(如libcrypto和libssh)编译库并强制它们使用旧的libstdc++标准库 3) 有没有其他方法可以

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

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

因此,我的问题如下:

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

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


3) 有没有其他方法可以摆脱这种混乱局面?

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

在我的例子中,它是通过将标准的C++ LIB设置为GNU版本,然后添加LBC+++作为我的任何其他系统库。< /P> < P > 1)是的,只要这些单独的模块实际上不传递对象,就可以混合和匹配C++代码运行的C++运行时。例如,如果你的应用程序中有两个模块,只暴露C API,但内部使用C++,那么每个模块都可以使用他们想要的C++运行时。尝试在运行时之间共享对象时出现问题

2)在编译和链接时,可以使用'-STDLIb= LIbSTDc++或'-STDLIB=LBC++'命令行参数来指定使用哪个C++库。如果最终的可执行文件需要针对这两个文件进行链接,则需要手动指定另一个文件(例如--stdlib=libc++-lstdc++)


3) 是的,但是请注意libstdc++在几年前就被弃用了,甚至在watchOS和tvOS上都不可用,所以最好的办法就是把一切都交给libc++。

谢谢。这就是我一直在寻找的答案。您知道是否存在命令行参数来链接库,然后仅为这个指定显式地指定STL版本?编译单个源文件时,您指定使用的C++运行时,编译器将为该运行时使用适当的STL。这是在编译时使用--stdlib=libc++或--stdlib=libstdc++。在链接时,--stdlib=。。。参数只映射到适当的库链接;这就是为什么需要在链接时手动指定另一个。