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

相关推荐
喆星时瑜2 分钟前
【Docker】运行错误提示 unknown shorthand flag: ‘d‘ in -d ----详细解决方法
运维·docker·容器
长流小哥1 小时前
Linux网络编程实战:从字节序到UDP协议栈的深度解析与开发指南
linux·c语言·开发语言·网络·udp
极小狐1 小时前
极狐GitLab 功能标志详解
linux·运维·服务器·elasticsearch·gitlab·极狐gitlab
jinan8862 小时前
加密软件的发展:从古典密码到量子安全
大数据·运维·服务器·网络·安全·web安全
雾原2 小时前
Red Hat Enterprise Linux (RHEL)系统部署
linux
您8132 小时前
二十、FTP云盘
linux·服务器·网络
用户3409704691152 小时前
ROS2-Jazzy编译功能包报错
linux
越学不动啦2 小时前
十、自动化函数+实战
运维·软件测试·自动化·测试
264玫瑰资源库3 小时前
2025年七星棋牌跨平台完整源码解析(200+地方子游戏+APP+H5+小程序支持,附服务器镜像导入思路)
服务器·游戏·小程序
程序员阿灿3 小时前
CentOS服务器能ping通却无法yum install:指定镜像源解决
linux·服务器·centos