【学习笔记之Linux】工具之gcc/g++

简介: 【学习笔记之Linux】工具之gcc/g++

背景知识:

gcc/g++是一个编译器,注意区分编译器和编辑器,vim是是编辑器。简单的说,编辑器是我们敲代码的工具,我们在编辑器上写出我们需要实现的功能;编译器负责实现功能,把我们写的高级语言编译成计算机看得懂的机器语言。

 程序的翻译经过了预处理、编译、汇编、链接四个过程。

 预处理:头文件展开,条件编译,宏替换,去注释等;

 编译:生成汇编,gcc会首先检查代码的规范性、是否有语法错误等,检查无误之后才开始生成汇编代码;

 汇编:生成机器可识别的代码,将我们自己的代码进行翻译行程二进制目标文件,不可被执行;

 链接:生成可执行文件或库文件,将形成的.obj文件和库文件进行合并,形成可执行程序。


8ef789353fbd4e6b90794510bf882e7e.png

gcc语法:

  gcc [选项] 要编译的文件 [选项] 目标文件

编译过程:

  预处理:gcc -E 要编译的文件 -o 目标文件,-E的作用是让gcc在预处理结束后就停止编译,-o是指目标文件,.i文件为已经与处理过的原始程序。


4f374df4a15d4d21a60905b8382ce1ac.png

编译:gcc -S .i文件 -o .s文件,用户可以使用-S选项来查看,这里只是进行编译,生成汇编代码,而没有进行汇编。

239aa0186c584b5f83bad3f8cf3ce4bf.png


汇编:gcc -c .s文件 -o .o文件,这里已经将汇编语言转换为二进制目标文件了。

 反面教材来了,我在这里输错一些东西,第一次汇编,我-c输成-s了,就造成了/usr/bin/ld: no .eh_frame_hdr table will be created.错误,这是依赖关系的问题,之后Makefile的时候会提到。随后又出现了另一个问题,应该生成test.o文件,我误输成test.c了,但是我这个目录下已经有个test.c文件了,就造成原来的test.c直接被覆盖了。然后我就继续用test.s文件进行汇编,一样可以汇编出正确文件,应为我的test.s是经过源码预处理、编译过来的,就算源码被删除也不会影响已经生成test.s文件。这里也从侧面说明了,我们给文件加上后缀的重要性,就算Linux并不依据后缀判定文件类型,但是这个后缀是写给我们自己看的,除了部分文件有特殊颜色标识外,大多数文件是正常的白色。

c56796abb9394dfe8667a75f92ab021b.png

 链接:gcc .o文件 -o 可执行文件或库文件

b33eda880bee4331b23297db2054b8b9.png

 上面的步骤可以不用一步一步的走,直接gcc -o 生成文件 目标文件,可以直接生成可执行文件。


9e4d7ddecbdc438db7864342ab6f878a.png


概念补充:

 库函数

 在C程序中,有很多东西都是没有定义函数实现的,而是被包含在库函数中实现的。链接的作用就是链接到这些库函数。Linux系统默认携带了语言级别的头文件和语言对应的库。

 函数库一般分两种静态库和动态库,库的本质也是文件。静态库一般命名方式为lib xxx .a,在编译链接时静态库的代码会全部被加入到可执行文件中,因此生成的文件比较大,同时程序运行时也就不需要库文件了,就算对应库文件被删除或者修改也不会影响对应的程序;动态库则为lib xxx .so,动态库与静态库相反,并没有把代码加入到执行文件中,而是在程序运行时由链接文件加载库,从而大大节省空间,但是如果对应的库被修改就会影响到对应的程序。


08b51ea3ba744168a276a09123ce180c.png


gcc选项:

 -E:只激活预处理,但是并不生成文件,如果要生成文件需要重定向到一个输出文件里面

 -S(大写S):编译到汇编语言,不进行汇编和链接,只生成汇编代码

 -c(小写c):编译到目标代码

 -o(小写o):文件输出到文件

 -static:对生成的文件采用静态链接

 -g:生成调试信息,GNU调试器可利用该信息

 -shared:次选项将尽量使用动态库,生成文件的体量相对较小

 -O0,-O1,-O2,-O3编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

 -w(小写w):不生成任何警告信息。

 -Wall:生成所有警告信息


目录
相关文章
|
4天前
|
数据挖掘 大数据 Linux
探索Linux中的snice命令:一个虚构但启发性的数据分析工具
`snice`是一个想象中的Linux命令,用于低优先级地从大数据集中抽样数据。它结合`nice`和`sampling`,支持多种抽样策略,如随机和分层。参数包括指定样本数、策略、输入输出文件和进程优先级。示例:`snice -n 1000 -s random -i large_log.txt -o sample_log.txt`。使用时注意资源管理、数据完整性及权限,并与其它工具结合使用。虽然虚构,但体现了Linux工具在数据分析中的潜力。
|
6天前
|
Shell Linux
RSIC-V“一芯”学习笔记(二)——Linux入门教程
RSIC-V“一芯”学习笔记(二)——Linux入门教程
|
10天前
|
存储 Unix Linux
探索Linux中的sed命令:强大的文本处理工具
`sed`是Linux/Unix的流编辑器,用于文本替换、删除、新增等操作,无需直接编辑文件。它逐行处理输入,存储在模式空间,执行脚本后输出。主要特点是非交互、支持正则表达式和简洁语法。示例:`sed 's/apple/orange/g' example.txt`替换文本,`/error/d`删除包含"error"的行,`a\---`在每行后加"---"。使用时注意备份、测试命令和理解正则表达式。
|
12天前
|
监控 算法 Linux
Linux下工具tc详细讲解及限制IP和端口实例
TC (Traffic Control) 是Linux内核中提供的一个用于控制和管理网络流量的强大工具,它允许用户实现QoS(Quality of Service)策略,包括带宽限制、优先级控制、延迟保证等。TC基于内核的队列 discipline (qdisc) 和流量类别(class) 体系结构,允许对进入或离开网络接口的数据流进行复杂的整形和过滤。
|
12天前
|
运维 Linux 应用服务中间件
Linux之自动化运维工具ansible、ansible模块(2)
Linux之自动化运维工具ansible、ansible模块(2)
|
12天前
|
运维 Linux Shell
Linux之自动化运维工具ansible、ansible模块(1)
Linux之自动化运维工具ansible、ansible模块(1)
|
12天前
|
缓存 网络协议 Linux
Linux下脚本编写局域网扫描工具
Linux下脚本编写局域网扫描工具
|
2月前
|
Linux 编译器 开发工具
Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)
Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)
|
9月前
|
IDE Linux 编译器
【Linux】gcc/g++编译器、make/Makefile自动化构建工具
目录 1.gcc/c++的概念: 2.程序编译过程详解: 2.1程序编译过程:
62 0
|
2月前
|
小程序 Linux 开发工具
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解