c++11 - 来自 ubuntu 16.04 repo 的 c++ 库 - 编译器选项

标签 c++11 ubuntu

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-devlibsdl2-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/

相关文章:

c++ - 反转 C++ 元组

c++ - 将第一个派生类转换为第二个派生类 - 为什么它有效?

php - 如何让 PHP 列出所有 Linux 用户?

c++ - 创建共享库时发生核心转储

python - 我怎么知道要安装哪个版本的 pip 包?

c++ - 为什么C++ 11不允许使用auto进行直接列表初始化

c++ - 同一个库在16.04下和14.04下定义了不同的符号

c++ - 为什么我不能返回对压缩字段的引用?

c++ - 缓存命中/未命中数与页面错误数 - C++ 代码 - UBUNTU

PHP-FPM + Laravel + Nginx + Ubuntu 权限