东南大学-NetSI
用户3024
添加快捷方式
分享
Makefile编译
输入“/”快速插入内容
Makefile编译
用户3024
用户3024
2024年12月27日修改
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
简单编译原理
1 hello, world在计算机的表示
hello 程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创建并保存的文本文件,文件名是 hello.c。源程序实际上就是一个由值 0 和 1组成的位(又称为比特)序列,8 个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符
大部分计算机使用 ASCII 标准来表示文本字符
•
用一个唯一的单字节大小的整数值息来表示每个字符
•
hello.c 程序是以字节序列的方式储存在文件中的
hello.c 的表示方法说明了一个基本思想∶ 系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的
2 编译过程
hello 程序的生命周期从一个高级 C 语言程序开始
为了在系统上运行 hello.c 程序,每条 C 语句都必须被其他程序转化为一系列的低级机器语言指令