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下一章会带大家一起做一个进度条的,期待大家到来。

相关推荐
HABuo18 分钟前
【Linux进程(四)】进程切换&环境变量深入剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
oMcLin32 分钟前
如何在 Rocky Linux 8.7 上通过 Prometheus 与 Grafana 结合,提升大规模容器环境的监控与性能分析?
linux·grafana·prometheus
橘颂TA33 分钟前
【Linux】死锁四条件的底层逻辑:从锁冲突到 STL 组件的线程安全实践(Ⅵ)
linux·运维·服务器·c++·死锁
埃伊蟹黄面36 分钟前
ELF深入解剖:从文件头到动态段,图解库的二进制构成
linux·c·
五仁火烧1 小时前
生产环境中配置了接口3000后,不能启动,改成8080后就可以
linux·网络·安全·vue
黄焖鸡能干四碗1 小时前
智能制造工业大数据应用及探索方案(PPT文件)
大数据·运维·人工智能·制造·需求分析
JiMoKuangXiangQu1 小时前
Linux build:头文件安装
linux·headers_install
橙露1 小时前
国产PLC与进口PLC全面对比分析:技术、市场与未来趋势
运维·网络
lbb 小魔仙1 小时前
【Linux】云原生运维效率提升:Linux 终端工具链(kubectl + tmux + fzf)组合拳教程
linux·运维·云原生
清水白石0081 小时前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python