【Linux】--基础开发工具->gcc/g++

gcc:其默认是编译C语言程序

g++:其默认编译C++程序

下面我们看看对于这些文件是如何进行编译的。

一、程序的编译过程

1、预处理

头文件展开

去注释

宏替换

条件编译

条件编译的本质是对代码进行裁剪,就比如我们一个软件,那么我们有的功能是收费的,有的功能是免费的,那么我们是否需要去进行两个软件的编写呢?

可以是可以,但是这样问题也很多,我们日常要维护的代码变成了两份,维护工作一下子就上来了,然后就是测试,还有新功能的上线等等。

2、编译

把我们的C语言编译成-汇编语言。

语法:gcc -S code.i -o code.s

程序开始编译,从C翻译成汇编语言就停下来

3、汇编

把汇编语言 翻译成二进制文件.o(可重定位目标二进制文件)

语法:gcc -c code.s -o code.o

4、链接

语法:gcc code.o -o code

总结

预处理(进行宏替换/去注释/条件编译/头文件展开)

编译(生成汇编文件)

汇编(生成二进制文件)

链接(生成可执行程序)

二、gcc/g++的使用

我们在使用编译器的时候,直接使用的话,是直接从预处理到链接生成可执行文件的:

可以看到绿色的那个文件就是我们刚刚生成的可执行文件。

下面我们来看看各个阶段是如何进行的:

1、预处理

我们当前有一个刚刚写好的代码文件,那么我们只需要其进行预处理的过程,那么我们只需要加上-E的选项即可。

如下:

gcc -E 要处理的文件 -o 要生成的预处理文件

演示:gcc -E text.c -o text.i

完成预处理的工作,然后将预处理的结果放在text.i文件中。

如上我对code.c文件进行预处理,然后在当前工作目录下生成了code.i文件。

我们使用vim打开看看其内容:

这就是预处理后的结果了。

2、编译

在这个阶段,编译器会去检查代码的语法等是否有错误,然后把代码翻译成汇编的形式

语法:-S选项

如:gcc -S code.i -o code.s

下面我们把我们刚刚预处理生成的code.i文件进行编译处理。

下面是编译后的结果:

3、汇编

使用-c选项就可以将已经编译好的文件code.s汇编成二进制目标文件了。

例:gcc -c code.s -o code.o

使用vim打开生成的二进制文件:

4、链接

语法:gcc code.o -o code

三、动静态库

我们进行链接的时候会和库产生连接。

库是给我们提供可复用代码的核心载体

链接过程通过处理库中的代码,

头文件提供声明,然后库是代码的实现

库还分为动态库和静态库。

在Linux下分别是.so .a

动态库:就是需要的时候,才取,其好比如有一个地址这样

静态库:直接拷贝到目标文件中

静态库:sudo yum/apt install -y glibc -static

动态库:sudo yum/apt install -y libstdc++-static

动态库和静态库的对比:

动态库:又叫共享库,可以有效的节省资源,但是要是动态库出现问题,那么程序就会崩

静态库:不依赖外部库,程序运行稳定,但是很消耗内存

相关推荐
刘马想放假1 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
kloc2 小时前
聊天室项目入口网关子服务的实现
linux·c++
GeW2 小时前
深圳APEC峰会倒计时:数据库与Linux运维的"隐形考场"
linux
梦到啥说啥3 小时前
Linux网络编程:UDP网络协议
linux·网络协议·udp
无足鸟ICT5 小时前
【RHCA+】ipcrm命令(删除IPC资源)
linux
星恒随风6 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Z21-X7 小时前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
陈希1238 小时前
Linux 网络诊断工具实战:ping、curl、tcpdump、mtr、dig 用法详解
linux·网络·tcpdump
进击的荆棘9 小时前
Linux系统——线程同步与互斥之线程池和安全
linux·运维·服务器·安全·单例模式·线程
刘大望9 小时前
不用买开发板:用 QEMU 走通嵌入式 Linux 全流程(三)存储与网络实地验证
linux·qemu·嵌入式linux·alpine