【学习笔记之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:生成所有警告信息


目录
相关文章
|
1月前
|
安全 Linux Shell
四、Linux核心工具:Vim, 文件链接与SSH
要想在Linux世界里游刃有余,光会“走路”还不够,还得配上几样“高级装备”。首先是Vim编辑器,它像一把瑞士军刀,让你能在命令行里高效地修改文件。然后要懂“软硬链接”,软链接像个快捷方式,硬链接则是给文件起了个别名。最后,SSH是你的“传送门”,不仅能让你安全地远程登录服务器,还能用scp轻松传输文件,设置好密钥更能实现免-密登录,极大提升效率。
268 3
|
1月前
|
安全 Linux iOS开发
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
130 0
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
|
1月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
139 16
|
3月前
|
缓存 监控 Linux
Linux系统性能调优技巧和相关工具
Linux 作为一种应用应展和系统服务的优选操作系统,在处理性能和端到端点评估上持有出色表现。但是,在处理进程或系统处于低效状态时,性能调优就显得十分重要。本文将探讨一些 Linux 系统性能调优的常用技巧,并介绍相关工具
120 0
Linux系统性能调优技巧和相关工具
|
3月前
|
Linux 数据安全/隐私保护 iOS开发
推荐Linux环境下效能优良的双向文件同步工具
综合上述条件,对于Linux环境下的双向文件同步需求,Unison 和 Syncthing 是两个非常出色的选择。它们都有良好的社区支持和文档资源,适用于不同规模的环境,从个人使用到商业部署。Unison 特别适合那些需要手动干预同步过程、需要处理文件冲突解决的场景。而 Syncthing 更加现代化,适合需要自动、实时的数据同步与备份的环境。对于选择哪一个,这将取决于个人的使用场景和具体需求。
394 16
|
2月前
|
数据采集 编解码 运维
一文讲完说懂 WowKey -- WowKey 是一款 Linux 类设备的命令行(CLT)运维工具
WowKey 是一款面向 Linux 类设备的命令行运维工具,支持自动登录、批量执行及标准化维护,适用于企业、团队或个人管理多台设备,显著提升运维效率与质量。
|
1月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
286 1
二、Linux文本处理与文件操作核心命令
|
1月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
551 56