【问题标题】:Where is the standard library?标准库在哪里?
【发布时间】:2015-03-01 18:21:56
【问题描述】:

我在 Google 上进行了搜索,但没有找到对我的查询非常直接的答案。

我一直在阅读 C++ Primer,而且我对这门语言还是很陌生,但是尽管这本书非常好,它讨论了标准库的使用,但并没有真正描述它的位置或来源(反正还没有)。那么,标准库在哪里?让我访问它的头文件在哪里?当我下载 CodeBlocks 时,是否附带了 STL?还是它会自动随我的操作系统一起提供?

有点相关,但是 Cobeblocks 附带的 MinGW 到底是什么? Here 它说

MinGW 是一个 C/C++ 编译器套件,它允许您创建 Windows 可执行文件而不依赖于此类 DLL

那么在最基本的层面上,它只是让我制作 C++ 程序所需的“东西”的集合吗?

为这个非常基本的问题道歉。

【问题讨论】:

  • 如果“hello, world”编译并运行,您可能拥有标准库。头文件保存在磁盘上的位置取决于操作系统和编译器。但你通常不需要知道这一点。当然,如果您有兴趣,可以尝试在文件系统中搜索名为iostream 或类似名称的文件。您可以查看here 标准库包含的内容。
  • 问题不在于这个问题是“基本的”;只是它“没有重点”,而且您似乎没有做太多先前的研究。
  • @Lightness Races in Orbit 假设我没有完成这项研究是不公平的。我知道我研究了什么,但我没有得到正确的信息。无数次搜索“标准库在哪里”并没有得到准确的答案,当你用 30 分钟谷歌搜索你的问题时,你只会对自己想“你知道吗,我可以花 5 分钟问我的问题,然后有人可以花 5 分钟回答我的确切问题,我就完成了”。
  • @Silversonic:这不是假设。这是一个观察。您还没有阅读您的 C++ 书籍并收集了有关该主题的知识。只是在 Google 上随机拍摄不是“研究”!我们来这里不是为了消除不断的无研究尝试以节省 其他 人的时间,无论回答需要 5 分钟还是 30 分钟。它无法扩展。无论如何,再一次,更大的问题是注意力不集中 - 它非常健谈,我看不出它在未来能专门帮助其他人。
  • “我们在这里不是为了消除不断的无研究尝试以节省其他人的时间,”如果真的是这样的问题,那么模组可以随意删除我的主题。我知道我投入研究的时间,我可以展示我的历史照片。我放弃了,我直接问了一个问题以节省时间。有这么可怕的事情吗?

标签: c++ codeblocks


【解决方案1】:

“我下载 CodeBlocks 的时候,有没有自带 STL?”

尽管它不称为 STL,而是 C++ 标准库,但它与您的 c++ 编译器实现一起提供(并且可以选择与 CodeBlocks IDE 一起打包)。

您必须区分 IDE 和编译器工具链。 CodeBlocks(I集成D开发E环境)可以配置为使用许多不同的编译器工具链(例如 Clang 或 MSVC)。

“或者它会自动随我的操作系统一起提供?”

不,通常不会。尤其不适用于 Windows 操作系统

“那么,标准库在哪里?让我访问它的头文件在哪里?”

它们随附您当前用于 CodeBlocks 项目的编译器工具链。
假设这是 MinGW GCC 工具链,它安装在默认目录中,你会在类似的目录下找到库(这就是我所拥有的)

C:\MinGW\lib\gcc\mingw32\4.8.1

和头文件在

C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++

“那么在最基本的层面上,它只是让我制作 C++ 程序所需的“东西”的集合吗?”

这是适用于 Windows 的极简主义 GNU 工具链。它通常伴随着 GCC(GNU C/C++ 编译器工具链),以及 MSYS 极简 GNU 工具环境(包括 GNU make、shell 等)。

【讨论】:

    【解决方案2】:

    当您安装了 C++ 实现后,您将拥有实现使用 C++ 源文件所需的一切并将它们变成运行的东西的东西。如何做到这一点完全取决于特定的 C++ 实现。大多数情况下,有一个编译器,它处理单个源文件并将它们转换为目标文件,然后由链接器组合以产生实际的运行程序。这绝不是必需的,例如,cling 直接解释 C++ 代码而无需编译。

    所有这一切只是为了澄清 C++ 的实现方式并没有一种方式,尽管大多数当代 C++ 实现都遵循编译器/链接器的方法,并将库作为文件集合提供,其中包含声明和提供这些实现的库文件声明。

    C++ 标准库的位置及其声明的位置完全取决于 C++ 实现。奇怪的是,到目前为止我遇到的所有 C++ 实现,除了 cling 都使用编译器,并且所有这些编译器都支持预处理 C++ 文件的-E 选项(尽管它在 MSVC++ 中拼写为 /E)。通常相当大的输出显示指向声明位置的包含文件的位置。也就是说,在命令行上执行类似这样的操作会生成一个包含位置信息的文件:

    compiler -E input.cpp > input.ii
    

    编译器compiler 的实际命名方式完全取决于C++ 实现,类似于g++clang++ 等。文件input.cpp 应该包含适用于其中一个标准的包含指令C++ 库头文件,例如

    #include <iostream>
    

    在输出 input.ii 中搜索应该会显示此标头的位置。当然,编译器有可能使声明可用,而实际上并未包含文件,而只是使声明可见。曾经有一个像这样的编译器 (TenDRA),但我不知道有任何当代编译器这样做(modules 正在考虑进行标准化,不过这些可能会在未来回归)。

    包含实现各种声明的对象的实际库文件所在的位置是一个完全不同的问题,定位这些文件往往涉及更多内容。

    安装 CodeBlocks 时可能以某种方式安装了 C++ 实现。我认为这只是一个包。在某些 Linux 上具有像 dpkg 这样的包管理系统的系统上,让 IDE 依赖于编译器(例如,对于 CodeBlocks 的 gcc)并且让编译器依赖于标准 C++ 库(对于gcc) 并让包管理系统整理出安装方式。

    【讨论】:

    • 实施。紧贴。逗号。 avaiaible。这里有FGITW问题吗? :)
    • GCC 的 -H 选项可能比 -E 更有用,虽然两者都可以,但我不知道 -H 的便携性如何。
    • @LightnessRacesInOrbit:在移动设备上写回复时出现一些错别字,但没有突出显示错别字,这还不错。 ... 并且“紧贴”有意的:它是一个基于 clang 的 C++ 解释器。
    【解决方案3】:

    C++ 标准库有多种实现。一些比较流行的有 libstdc++,它与 GCC 一起打包,libc++,可以与 Clang 一起使用,或者微软的 Visual Studio's implementation。他们使用 Dinkumware 实施的许可版本。 MinGW 包含一个 GCC 端口。 CodeBlocks 是一个 IDE,允许您选择与 MinGW 版本一起打包或不打包的设置。无论哪种方式,如果您愿意,您仍然可以将 IDE 设置为使用不同的编译器。标准库实现的一部分也将是头文件,而不仅仅是二进制文件,因为其中很多是模板代码(只能在头文件中实现。)

    我建议您阅读相应技术的文档,因为它们包含大量信息,比教程或书籍要多:

    libstdc++ faq

    MinGW faq

    MSDN

    【讨论】:

    • 没有回答问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2012-07-08
    • 1970-01-01
    相关资源
    最近更新 更多