跳转至

Intro#

1 GCC 官方文档#

GCC 官方文档网站:https://gcc.gnu.org/onlinedocs/

  • 官方文档是最权威的,网上所有的答案都来自官方文档
  • 适应英语阅读,中文是母语,很多词我们自己有根深蒂固的含义和概念,再重新赋予新含义非常不容易理解或有歧义
  • 英语用词、逻辑比较严谨,网上的翻译水平参差不齐,坑很多
  • 国内论坛找到好答案全凭运气,好的答案可以节省时间,没有好的答案还是得花时间看官方文档,所以还是自己靠谱一点,锻炼一下英语能力

2 GCC的介绍#

  GCC 是 GNU项目的一个产品。

  GCC(GNU Compiler Collection,GNU编译程序集合)是最重要的开放源码软件。其他所有开放源码软件都在某种层次上依赖于它。甚至其他语言,例如 Python,都是由 C 语言开发的,由 GNU 编译程序编译的。

  这个软件对于整个自由软件运动而言具有根本性的意义。如果没有它或类似的软件,就不可能有自由软件运动。GCC 为 Linux 的出现提供了可能性。

  GCC 是由许多组件组成的,但它们也并不总是出现的。有些部分是和语言相关的,所以如果没有安装某种特定语言,系统中就不会出现相关的文件。

2.1 GCC常见的组成部分#

  • c++: gcc 的一个版本,默认语言设置为 C++,而且在链接的时候自动包含标准 C++ 库。这和 g++ 一样

  • configure: GCC 源代码树根目录中的一个脚本。用于设置配置值和创建 GCC 编译程序必需的 make 程序文件

  • g++: gcc 的一个版本,默认语言设置为 C++,而且在链接的时候自动包含标准 C++库。这和 c++ 一样

  • gcc: 该驱动程序等同于执行编译程序和连接程序以产生需要的输出

  • libgcc: 该库包含的例程被作为编译程序的一部分,是因为它们可被链接到实际的可执行程序中。它们是特殊的例程,链接到可执行程序,来执行基本的任务,例如浮点运算。这些库中的例程通常都是平台相关的

  • libstdc++: 运行时库,包括定义为标准语言一部分的所有的 C++类和函数

2.2 GCC包含的常见的软件#

  • ar: 这是一个程序,可通过从文档中增加、删除和析取文件来维护库文件。通常使用该工具是为了创建和管理连接程序使用的目标库文档。该程序是 binutils 包的一部分

  • as: GNU 汇编器。实际上它是一族汇编器,因为它可以被编译或能够在各种不同平台上工作。该程序是 binutjls 包的一部分
    autoconf:产生的 shell 脚本自动配置源代码包去编译某个特定版本的 UNIX

  • gdb: GNU 调试器,可用于检查程序运行时的值和行为
    GNATS:GNU 的调试跟踪系统(GNU Bug Tracking System)。一个跟踪 GCC和其他 GNU 软件问题的在线系统

  • gprof: 该程序会监督编译程序的执行过程,并报告程序中各个函数的运行时间,可以根据所提供的配置文件来优化程序。该程序是 binutils 包的一部分

  • ld: GNU 连接程序。该程序将目标文件的集合组合成可执行程序。该程序是 binutils 包的一部分

  • libtool: 一个基本库,支持 make 程序的描述文件使用的简化共享库用法的脚本

  • make: 一个工具程序,它会读 makefile 脚本来确定程序中的哪个部分需要编译和连接,然后发布必要的命令。它读出的脚本(叫做 makefile 或 Makefile)定义了文件关系和依赖关系

3 GCC默认头文件搜索路径#

查看命令

echo | gcc -v -x c -E -

  • /usr/lib/gcc/x86_64-linux-gnu/7/include
  • /usr/local/include
  • /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
  • /usr/include/x86_64-linux-gnu
  • /usr/include