Ubuntu 16.04 带有支持 c++11 的 GCC 5.4,它是默认编译器。默认情况下,该特定版本的 GCC 中未启用 c++11。
我的意图是使用他们的存储库(例如 boost)中的一些二进制库(不仅仅是头文件)。在我的项目中,我将启用 c++ 11。
存储库中的 c++ 库是如何编译的?是否可以在启用 c++ 11 的情况下使用它们?我知道通过将所有 c++ 内容隐藏在纯 C 接口(interface)后面,可以从不同的语言(Java、Python、C# 等)调用 c++ 库。有了boost就不是这样了。如果某个函数返回给我一个字符串或一个向量或来自 STL 的任何东西,那么它就是一个问题。 AFAIK STL 对象二进制表示取决于编译器标志(例如 std=c++11)。
谢谢你。
最佳答案
您在谈论哪些确切的库?
如果您在谈论标准库,libstdc++
是 gcc
的一部分.无论您使用哪种标准编译,都可以链接它。 gcc
还决定包含 ABI 标记,以便它们可以与在 C++11 和 C++11 之前编译的代码兼容 ABI。例如,请参阅 TC 对我在这里提出的问题的非常好的回答:
Is this simple C++ program using <locale> correct?
如果通过
How were c++ libraries from the repository compiled?
你的意思是,ubuntu 存储库中的所有 C++ 库是如何编译的,答案是,每个库可能不同。
例如,如果您想使用
libfreetype6-dev
或 libsdl2-dev
,这些是 C 库,无论您针对什么标准,它们都可以链接到。如果你想使用
libsilly-dev
来自 CEGUI,这是一个 C++ 库,通常最好为您的项目和您要链接到的 C++ 库使用完全相同的编译器。如果它出现在 ubuntu 存储库中,您可以假设它是使用默认的 g++
构建的。 ubuntu 正在发货的版本。如果您需要使用不同的编译器,最好自己构建 C++ 库 - 通常 C++ 在不同编译器甚至同一编译器的不同版本之间都不是 ABI 稳定的。如果要使用编译后的
boost
库,最好使用他们给你的库并使用他们给你的编译器。如果您仅使用仅 header 提升,则编译器无关紧要,因为您实际上不必链接到他们构建的东西。因此,您在编译器方面拥有更大的灵 active 。通常,如果您需要使用 C++ 库,最好将它们的构建系统集成到您的库中,以便可以轻松地从源代码重新构建它,您只需配置一次编译器。 (至少根据我的经验。)当您决定稍后升级编译器时,这可以节省大量时间。如果您使用
cmake
那么这通常是可行的,但有时这可能很难,特别是如果你有很多 C++ 依赖项。如果你不使用 cmake
,好吧,许多图书馆使用cmake
并且以这种方式集成它们并不容易。 cmake
无论如何仍然是一种痛苦,所以这可能不是这样的损失。
关于c++11 - 来自 ubuntu 16.04 repo 的 c++ 库 - 编译器选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38944868/