Linux - gcc/g++的编译方式

目录

前言

一、使用编译工具

二、程序翻译的过程

1.预处理

2.编译

3.汇编

查看可执行文件的汇编代码

查看文件类型信息

4.链接指令

查看可执行文件所依赖的库

三、库与库链接的区别

动态库:

静态库:

总结


前言

本质主要是探讨C/C++语言编译的过程,以及东静态库的了解


一、使用编译工具

我们当写一个 .c 文件时,当想将 .c 文件进行编译时就需要用指令 gcc 去进行编译,默认名字也可执行文件。

指令:gcc 指定名文件 加上 -o (名字)

想执行 test 文件时,路径带 ./加上可执行文件名即可

用 g++ 指令也可以进行编译与 gcc 指令一样。

但 gcc 只能编译 .c 文件,编译不了 cpp 文件,g++ 指令可以编译 .c 和 .cpp文件,也就是说 cpp 文件只能用 g++ 指令进行编译。

测试:

报错:

二、程序翻译的过程

我们的程序为什么要进行编译?

主要原因是机器只处理二进制文件,人类由于对二进制处理不方便,所以就发明了汇编语言、高级语言去编写,然后将以上语言进行编译处理为二进制交给计算机去处理。

1.预处理

预处理有哪些作用呢?1.将头文件展开 2.去注释 3.宏替换 4.条件编译 等 做了以上处理还是C文件。

当我们在编译的过程中只想看预处理的文件时也是有指令的,在文件编译的过程中在预处理就停止,使用 -E 功能。

指令:gcc -E code.c o code.i
Linux中C语言的头文件路径在 /usr/include/stdio.h

将stdio.h文件拷贝到引用文件test_c.c文件内部中,这步骤称为 头文件 展开。

所以头文件展开,本章是在预处理的时候,将头文件内容拷贝至源文件内。

可以发现上面都是stdio.h头文件的展开了。


这里也进行了去注释的处理。

2.编译

当预处理完成后,就要进行编程生成汇编文件了,我们为何要编译成汇编文件呢?主要是在以前的人已经将汇编语言可以生成二进制文件了,所以我们无需再将高级语言直接变为二进制文件,可以节省很多时间和难度。

使用 -S 进行程序翻译时,当编译完成就停止执行后面的操作。

指令:gcc -S code.i -o code.s
当想查看汇编代码时

指令:vim code.s

3.汇编

完成编译后我们就可以进行下一步,将汇编文件生成二进制文件了,使用指令 -c 。

-c 当汇编工作完成后就停止。

指令:gcc -c code.s -o code.o

code.o 文件是不可执行的,但我们也可以看到生成出的文件

查看可执行文件的汇编代码

指令:objdump -s 可执行文件

查看文件类型信息

指令:file 可执行文件

4.链接指令

链接指令无需使用功能,只需要正常gcc编译就会自动去链接文件

指令:gcc code.o -o code (自动与c库进行链接)

查看可执行文件所依赖的库

指令:ldd 可执行文件

三、库与库链接的区别

在系统中平台需要支持开发的话,就必须要提前在系统中安装语言的标准 头文件 + 库文件!

库分为动态库与静态库:

在不同的系统库的后缀名都不相同的。使用不同的库时,其实就是进行库的链接,库是被多个使用者共享使用的,当库一旦消失了,所有程序都不可运行的,因为程序依赖库文件。

动态库:

使用动态库时其实就是动态链接。

优点:比较节省资源,因为库的方法和函数都是由地址链接的,就不会出现大量重复的代码。

缺点:对库的依赖性比较强,一旦库丢失,所有使用这个库的程序都无法运行,对比静态库效率会稍微底下些。

静态库:

静态库相对应就是静态链接了。

优点:静态链接本质是将方法拷贝到可执行程序当中,所以会不依赖库,同类型平台中都可以直接运行使用,

缺点:可执行程序体积比较大,会导致浪费资源。

资源指的是磁盘、内存、网络等资源

动态链接方法直接gcc进行编译就会是默认动态链接

静态链接方法是在基础gcc编译时后面加上 -static 就会静态链接

指令:gcc -o test test.c -static


总结

本章主要是讲解c/c++语言在编译中所发生的过程,在Linux中可通过相应的功能去查看,Linux下一章会带大家一起做一个进度条的,期待大家到来。

相关推荐
挨踢攻城4 小时前
Linux 应急响应实操 Checklist
linux·运维·linux命令·rhce·rhca·厦门微思网络·linux 应急响应
wanhengidc4 小时前
什么是云手机?
运维·网络·安全·游戏·智能手机
optiz4 小时前
细菌基因组genome二代测序数据分析
linux·运维·服务器
m0_661316234 小时前
modbus_tcp和modbus_rtu对比&移植AT-socket,modbus_tcp&杂记
服务器·网络·tcp/ip
李游Leo4 小时前
LaTeX TeX Live 安装与 CTAN 国内镜像配置(Windows / macOS / Linux 全流程)
linux·windows·macos
IT成长日记5 小时前
【Linux基础】Linux系统管理:GPT分区实践详细操作指南
linux·运维·服务器·gpt·parted·磁盘分区·fdisk
羚羊角uou5 小时前
【Linux】匿名管道和进程池
linux·c++·算法
爱喝水的鱼丶5 小时前
SAP-ABAP: ABAP ASSIGN COMPONENT 语句详解:动态字段符号的利器作用用法示例详解
运维·开发语言·sap·abap·开发经验·动态字段符号
FLS1685 小时前
Kali搭建sqli-labs靶场
linux·sql·安全·网络安全
清寒敲代码5 小时前
k8s核心技术-Helm
运维·容器·kubernetes