Ubuntu 16.04带有GCC 5.4,它支持c ++ 11,它是默认的编译器。默认情况下,该特定版本的GCC中未启用c ++ 11。
我的意图是使用其存储库中的某些二进制库(不仅限于标头)(例如boost)。在我的项目中,我将启用c ++ 11。
存储库中的c ++库是如何编译的?是否可以在启用c ++ 11的情况下使用它们?我知道,可以通过将所有c ++内容隐藏在纯C接口之后,从不同的语言(Java,Python,C#等)调用c ++库。借助助推器,情况并非如此。如果某个函数从STL向我返回了字符串,向量或任何东西,那么这是一个问题。AFAIK STL对象的二进制表示形式取决于编译器标志(例如std = c ++ 11)。
谢谢你。
您在谈论哪些确切的库?
如果您在谈论标准库,它libstdc++
是的一部分gcc
。不管您以哪种标准进行编译,都始终可以链接它。gcc
还决定包括ABI标签,以便它们可以与在C ++ 11和C ++ 11之前编译的代码兼容。例如,请参阅TC对我在这里提出的问题的一个非常好的答案:
如果通过
存储库中的c ++库是如何编译的?
您的意思是,如何编译ubuntu存储库中的所有C ++库,答案是,每个库的C ++库可能不同。
例如,如果您要使用libfreetype6-dev
或libsdl2-dev
,这些都是C库,则无论您以什么标准为目标,都可以链接到它们。
如果libsilly-dev
要从CEGUI使用,那是一个C ++库,通常最好对项目和要链接到的C ++库使用完全相同的编译器。如果它出现在ubuntu存储库中,则可以假定它是使用g++
ubuntu出厂的默认版本构建的。如果需要使用其他编译器,则最好自己构建C ++库-通常,C ++在不同的编译器甚至同一编译器的不同版本中都不是ABI稳定的。
如果要使用编译的boost
库,最好使用它们给您的库并使用它们给您的编译器。如果仅使用仅标头的增强,则编译器没有关系,因为您实际上不必链接它们构建的内容。因此,您在编译器方面有了更大的灵活性。
通常,如果需要使用C ++库,最好将其构建系统集成到您的构建系统中,以便可以轻松地从源代码对其进行重建,而您只需要配置一次编译器。(至少以我的经验而言。)当您以后决定升级编译器时,这可以节省很多时间。如果使用,cmake
则通常是可行的,但有时会很难,尤其是在您具有许多C ++依赖项的情况下。如果您不使用cmake
,那么很多库都在使用cmake
,以这种方式集成它们并不是那么容易。cmake
无论如何仍然是一种痛苦,所以这可能不是那么大的损失。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句