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

相关推荐
深耕AI43 分钟前
【完整教程】宝塔面板FTP配置与FileZilla连接服务器
运维·服务器
serve the people1 小时前
Prompts for Chat Models in LangChain
java·linux·langchain
李昊哲小课1 小时前
Ubuntu 24.04 MariaDB 完整安装与配置文档
linux·ubuntu·mariadb
无聊的小坏坏2 小时前
从单 Reactor 线程池到 OneThreadOneLoop:高性能网络模型的演进
服务器·网络·一个线程一个事件循环
AI智域边界 - Alvin Cho3 小时前
Bloomberg、LSEG 与 MCP 缺口:为什么尚未发布完整的 MCP 服务器,以及多智能体系统如何解決这问题
运维·服务器
人间打气筒(Ada)3 小时前
zerotier内网穿透部署(rockylinux部署本地服务器)超详细~~~
linux·内网穿透·内网·公网·zerotier·穿透
Elias不吃糖3 小时前
Git常用指令合集
linux·git
_OP_CHEN3 小时前
Linux网络编程:(七)Vim 编辑器完全指南:从入门到精通的全方位实战教程
linux·运维·服务器·编辑器·vim·linux生态·linux软件
Maple_land4 小时前
第1篇:Linux工具复盘上篇:yum与vim
linux·运维·服务器·c++·centos
shizhan_cloud4 小时前
Linux 硬盘分区管理
linux·运维