当前位置: 首页 > news >正文

【Linux】编译器gcc/g++及其库的详细介绍

.格式

gcc 被编译的源文件 选项 编译的目标文件

选项:-o,生成指定文件

若不指定文件则默认生成a.out,若自定则生成指定的可执行文件

代码语言:javascript

AI代码解释

hyc@hcss-ecs-4ce7:~$ ls new new.c #未指定 hyc@hcss-ecs-4ce7:~$ gcc new.c hyc@hcss-ecs-4ce7:~$ ls a.out new new.c hyc@hcss-ecs-4ce7:~$ ./a.out 存在 存在 存在 存在 存在 #指定 hyc@hcss-ecs-4ce7:~$ gcc new.c -o new.exe hyc@hcss-ecs-4ce7:~$ ls new new.c new.exe hyc@hcss-ecs-4ce7:~$ ./new.exe 存在 存在 存在 存在 存在

2.编译的过程

2.1预处理

预处理的功能包括:替换宏定义、头文件展开、条件编译、去注释等 预处理的指令是从#开始的代码行 .c文件经过预处理会形成.i文件 -E选项:使编译器处理完预处理就停下

代码语言:javascript

AI代码解释

hyc@hcss-ecs-4ce7:~$ ls new new.c hyc@hcss-ecs-4ce7:~$ gcc -E new.c -o new.i hyc@hcss-ecs-4ce7:~$ ls new new.c new.i
2.2编译

编译主要功能:检查.i文件代码是否规范,是否有语法错误。检查无误后gcc将代码翻译为汇编语言,生成.s文件 -S选项:使编译器处理完编译就停下

代码语言:javascript

AI代码解释

hyc@hcss-ecs-4ce7:~$ ls -l total 28 drw-rwxr-x 2 hyc hyc 4096 May 26 15:41 new -rw-rw-r-- 1 hyc hyc 219 May 29 21:58 new.c -rw-rw-r-- 1 hyc hyc 18047 Jun 3 13:31 new.i hyc@hcss-ecs-4ce7:~$ gcc -S new.i -o new.s hyc@hcss-ecs-4ce7:~$ ls -l total 32 drw-rwxr-x 2 hyc hyc 4096 May 26 15:41 new -rw-rw-r-- 1 hyc hyc 219 May 29 21:58 new.c -rw-rw-r-- 1 hyc hyc 18047 Jun 3 13:31 new.i -rw-rw-r-- 1 hyc hyc 895 Jun 3 13:38 new.s
补充:为什么要将代码翻译成汇编?

在计算机刚刚诞生的时代,没有任何编程语言,科学家是通过计算机上的元器件开关来控制计算机的。后来科学家发明了”打孔编程“,通过纸袋传递二进制信息 再后来又发明了汇编语言,但汇编语言无法直接传递二进制信息。于是对于汇编语言的编译器诞生了。通过编译器将汇编语言映射为二进制,来操控计算机 再后来就出现了各种各样的编译性语言:例如C/C++,java,python等等等等。对于这些语言我们也需要将其翻译为二进制,计算机才能明白我们的意图。 但是这里有两条路:C -> 二进制,C ->汇编?选着哪条? 显然我们选着了第二条路,因为C语言到二进制这无疑就困难的。而C到汇编语言仍是文本上的翻译,相对简单。我们可以直接站在巨人的肩膀上不用做二进制的翻译。

补充:编译器的诞生

汇编语言被发明了,想要汇编语言被翻译成二进制,那么需要一个编译器来编译汇编语言。那汇编语言的编译器是怎么来的?答案是:先通过二进制编写一个编译器,得到汇编语言的编译器后,再通过使用汇编语言写一个汇编编译器。最终得到一个汇编版的汇编编译器。 同理C语言被发明了,想要有一个C语言的编译器,只能先使用汇编语言编写一个C语言编译器,在通过C语言编译器写一个C语言的编译器。最终得到一个C语言版的C语言编译器。 这就是编译器的自举

2.3汇编

汇编主要功能:将.s文件转化为机器可识别的二进制文件(.o) -c选项:使编译器处理完汇编就停下

代码语言:javascript

AI代码解释

hyc@hcss-ecs-4ce7:~$ ls new new.c new.i new.s hyc@hcss-ecs-4ce7:~$ gcc -c new.s -o new.o hyc@hcss-ecs-4ce7:~$ ls -l total 36 drw-rwxr-x 2 hyc hyc 4096 May 26 15:41 new -rw-rw-r-- 1 hyc hyc 219 May 29 21:58 new.c -rw-rw-r-- 1 hyc hyc 18047 Jun 3 13:31 new.i -rw-rw-r-- 1 hyc hyc 1744 Jun 3 13:42 new.o -rw-rw-r-- 1 hyc hyc 895 Jun 3 13:38 new.s
2.4连接

将库方法与我们自己写的目标文件连接起来,形成可执行文件

代码语言:javascript

AI代码解释

hyc@hcss-ecs-4ce7:~$ gcc new.o -o new.exe hyc@hcss-ecs-4ce7:~$ ls -l total 52 drw-rwxr-x 2 hyc hyc 4096 May 26 15:41 new -rw-rw-r-- 1 hyc hyc 219 May 29 21:58 new.c -rwxrwxr-x 1 hyc hyc 15960 Jun 3 13:51 new.exe -rw-rw-r-- 1 hyc hyc 18047 Jun 3 13:31 new.i -rw-rw-r-- 1 hyc hyc 1744 Jun 3 13:42 new.o -rw-rw-r-- 1 hyc hyc 895 Jun 3 13:38 new.s hyc@hcss-ecs-4ce7:~$ ./new.exe 存在 存在 存在 存在 存在
补充:

记忆选项:ESc 记忆文件后缀:.iso

对于编译器来说一般都是先将所有的文件编译为 .o文件,再将全部 .o文件一起连接

3.理解条件编译

条件编译是在预处理阶段执行的,其具体操作是将不满足条件的代码直接抹去,只保留满足条件的

演示:

新建一个代码

保存并退出,我们让其进行预处理,然后再查看代码

代码语言:javascript

AI代码解释

hyc@hcss-ecs-4ce7:~$ gcc -E test.c -o test.i hyc@hcss-ecs-4ce7:~$ vim test.i

我们可以看到代码就只剩第一个printf函数了。

同时编译器还支持在命令行中动态的定义宏

代码语言:javascript

AI代码解释

#使用-D选项,可以实现在命令行中动态的定义宏 hyc@hcss-ecs-4ce7:~$ gcc test.c -o test hyc@hcss-ecs-4ce7:~$ ./test 收费->专业版 hyc@hcss-ecs-4ce7:~$ gcc test.c -o test -DM=10 hyc@hcss-ecs-4ce7:~$ ./test 免费->社区版

预处理的本质就是编辑我们的代码。像我们用到的vs、xshell等等工具都有社区版和专业版的区别,但不论是那个版本其本质都是同一个项目,只是使用了条件编译将专业版进行阉割作为社区版供给普通人免费使用。

http://www.jsqmd.com/news/813489/

相关文章:

  • OpenClaw-Dashboard:构建插件化统一监控与运维操作台
  • 3大痛点终结者:ExifToolGUI如何让照片元数据管理变得简单高效
  • 2026年质量好的羟基铁粉/化工铁粉厂家对比推荐 - 品牌宣传支持者
  • PCIe交换芯片技术解析:从竞争格局到企业生存之道
  • RFSoC配置实战:正交校正与粗延迟调优在射频系统中的应用
  • 不止于抓包:用Fiddler做移动端API调试和性能优化的5个实战技巧
  • 适合情侣复合的歌曲|一开口就破防,唱尽遗憾与舍不得,听完都想重新在一起
  • 从图像到十字绣:基于颜色量化与DMC匹配的自动化绣图生成技术
  • 5步突破Windows 11 Android生态壁垒:WSA Toolbox图形化解决方案深度解析
  • dotfiles配置管理:从原理到实践,打造高效可移植的开发环境
  • 微软如何穿越技术周期:从财务健康到业务全景的生存法则
  • Windows内存操作利器:ClawMem C++库实战指南
  • 2026年知名的广东EPDM防火泡棉长期合作厂家推荐 - 品牌宣传支持者
  • 为什么92%的Discord AI机器人3天内被封禁?ChatGPT合规集成的4个硬性红线,开发者必查
  • Linux系统下Filezilla FTP客户端的两种高效部署方案
  • 当计算机视觉模型开始“打架”:对抗性攻击与鲁棒性研究
  • 风电并网逆变器低电压穿越控制【附仿真】
  • Android Q(Android 10 API 29)适配指南——Scoped Storage in Android 10
  • 基于Wasserstein距离的仿真到现实迁移优化技术解析
  • 用HFSS Floquet Port仿真无限大阵列:从单元设计到S参数提取全流程解析
  • Java内存血缘追踪工具memlineage:定位内存泄漏的利器
  • 【Pixel专属Gemini Edge推理引擎】:本地运行LLM不联网、零延迟、功耗降低47%——实测数据首次公开
  • AI开发代码菜谱:从数据预处理到模型部署的实战指南
  • S32K3 FlexCAN实战:从MCAL配置到DMA接收,手把手教你避开那些手册里没写的坑
  • 从零掌握生成式AI:开源学习路径与实战项目全解析
  • 一人独立交付 UI + 前端:AI 驱动 UI 设计工具的五大功能模块深度评测
  • 第4章:C++ 对象生命周期
  • P1238 走迷宫【洛谷算法习题】
  • 别再搞混了!用Python和NumPy手把手教你从旋转矩阵解算Yaw/Pitch/Roll(附避坑指南)
  • TangleClaw v3:基于tmux的本地AI编码会话持久化与编排平台