介绍
前言
学习杜老师推荐的Makefile教程视频,链接。记录下个人学习笔记,仅供自己参考。
之前有转载过杜老师的从零Makefile落地算法大项目文章,感兴趣的可以看看。
本课程为第一课,主要讲解GCC编译器相关知识
1.GCC官方文档
GCC 的官方文档网站:https://gcc.gnu.org/onlinedocs/
- 官方文档是最权威的,网上所有的答案都来自官方文档
- 有问题建议Google、ChatGPT或者看官方文档
2.GCC的介绍
GCC 是 GNU项目的一个产品。GNU是一个自由软件计算,旨在创建一个完全自由的操作系统。GNU计划于1983年由理查德·斯托曼(Richard Stallman)发起,目的是为了建立一个完全自由的类Unix操作系统。目前GNU计划已经实现了许多操作系统组件,包括GCC(编译器)、GDB(调试器)等
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 -
以jetson nano为例,其默认头文件搜索路径为:
-
/usr/lib/gcc/aarch64-linux-gnu/7/include
-
/usr/local/include
-
/usr/lib/gcc/aarch64-linux-gnu/7/include-fixed
-
/usr/include/aarch64-linux-gnu
-
/usr/include
总结
本次课程主要学习了关于GCC的概念以及相关组成部分。