【Linux系统学习】系统编程开发工具编译器gcc/g++使用

简介: 上篇文章我们进入Linux系统编程的学习,介绍了代码的编辑器vim多功能编辑器的使用,编辑器的上手还是挺难的,要通过多多练习各个模式的命令集慢慢熟练起来。代码能够编辑后我们就要对代码进行编译运行,在Linux系统中我们使用gcc和g++编译器对我们写的代码进行编译运行。为了深入学习我们将从一个.c的源文件通过预处理、编译、汇编、连接变成我们的可执行程序使用gcc编译器详细呈现。

Linux系统下安装gccg++

安装gcc

yum -y install gcc


安装g++

yum -y install gcc-c++


gcc和g++的不同

gcc和g++对于C语言适用,而C++只能使用g++编译


gcc/g++的使用

格式         gcc/g++ [选项] 要编译的文件 [选项] [目标文件]


gcc/g++选项

·       -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面

·       -S 编译到汇编语言不进行汇编和链接

·       -c 编译到目标代码

·       -o 文件输出到 文件

·       -static 此选项对生成的文件采用静态链接

·       -g 生成调试信息。GNU 调试器可利用该信息。

·       -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.

·       -O0

·       -O1

·       -O2

·       -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

·       -w 不生成任何警告信息。

·       -Wall 生成所有警告信息。

例如:-o可以修改编译成功后的文件名,而不是默认生成a.out文件

 fd8ffdf380284d16935c4ea3d5195c16.png

预处理

源文件编译第一步是进行预处理,其作用为头文件的展开、宏替换、去掉注释、条件编译

头文件的展开

 76c758dce71a405089e6451c75c10733.png

-E表示预处理后就结束,-o将文件名

 

fa17a4258ebe4a6daf99bb1e770ef5a8.png

头文件include也就900多行,去掉注释在.i的文件中800多行,头文件展开相当于直接将头文件复制在.i文件中

宏替换

 

9fe611806c594be4a9e88debb7e924a4.png

直接打开刚才预处理好的.i文件;和.c源文件进行对比。我们会发现我们定义的宏在代码中已经全部替换。

注释的删除

 bb40db21091c46d886b7431dbc7354a7.png

预处理后我们的注释会被删除;

条件的编译

 c0b9eccfea134c1b9f93f9976b58d41b.png

6f2f42fcf9344d16b3161862f9582e1f.png

60d2185ef5d1464cbe023d3a5f996da1.png


条件编译会根据你设置的条件而删除一些代码。

编译

将代码编译成汇编代码

-S表示进行到程序的编译,编译完成即可停止。

 

fb25baa14af84c6fac1270afcf1c7475.png

59eddeb3ce9c40459cb6b6f57e75bcc6.png

左边为我们的初始源文件,右边为执行完编译后的文件,为汇编代码。

汇编

将汇编代码转化为二进制代码。

 429eeb8bc10146b2a7ffe522d43f3a82.png

-c表示执行到汇编结束后就停止。

 a80e4771fe114c0db17349ae752b03a9.png

左边为我们的初始源文件,右边为执行完汇编后的文件,为二进制代码。

链接

通过上面我们可以的到一个.o文件

c5f049d531784e92be8d8cf4da73b423.png

虽然.o文件时二进制依然执行不了,需要进行链接。链接是将我们的.o文件和系统库链接起来。

 cc0e0403487b4a3daaacbb15f93b844d.png


链接起来便可以执行。


系统库

我们现在所写的代码和各种编译器如何编译都是通过很多的年的发展所形成的,编写代码的过程中有很多我们不需要实际完成的函数,像输入,输出函数、字符串相关的函数等等,是系统帮助我们实现的。是以库的形式呈现给我们的。

库的分类

动态库

C/C++或者其他第三方提供所有方法的集合,被所有程序以链接的方式,动态关联起来。

优点:形成的可执行程序体积比较小,比较节省资源

缺点:稍微慢一些,强依赖动态库,动态库没了,所有的依赖这个库的程序都无法运行了

静态库

C/C+或者其他第三方提供的所有方法的集合,被所有的程序以拷贝的方式,将需要的代码拷贝到自己的可执行程序中,静态关联起来。

优点:无视库,可以独立运行

缺点:体积太大,浪费资源

库的安装

系统一般默认是不会安装静态库的,只有动态库。

 b61dbc7213bd489395a90c9d652307b3.png


使用static我们可以使用静态库,但是我们没有安装静态库,执行不了。

C动态库安装

yum install glibc-static

1d9fde3b72524d7d84580ae38817ac52.png

 

2d7b3807f0c04c209adf87034cb2b16f.png


使用静态库后我们明显看到体积会变大

C++静态库安装

yum install libstdc++-static


 5f94dd6833a44385a6cd128732570ebc.png

库的命名

.so 动态库   XXX.dll

.a静态库  XXX.lib


C++语言的后缀

.cpp

 

72f621d6b52c4b98bbef8746ab896537.png

如上图我们使用gcc编译.cpp文件是编译不过去的

.cc

1aedd96f08de425baa42746a2a7b763a.png

.cxx

 48dca82687264820b86922375179fa1f.png

相关文章
|
26天前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
3月前
|
Linux C语言
成功解决 在Linux CentOS 7 中安装gcc
这篇文章介绍了如何在Linux CentOS 7系统中安装gcc (g++) 8工具集。由于CentOS 7默认的gcc版本是4.8,而这个版本与Qt 5.14、Qt 5.15或更高版本不兼容,可能会导致编译时出现系统头文件错误。文章中提到,即使在项目配置中添加了`CONFIG+=c++11`,如果仍然报错,那么很可能是gcc版本的问题。为了解决这个问题,文章提供了使用CentOS的Software Collections (scl)来安装更新版本的gcc的步骤。
成功解决 在Linux CentOS 7 中安装gcc
|
2月前
|
Linux 编译器 C语言
Linux内核对GCC版本的检测
Linux内核对GCC版本的检测
|
3月前
|
Java Linux 编译器
【Linux】gcc简介+编译过程
【Linux】gcc简介+编译过程
|
6月前
|
缓存 Linux 测试技术
安装【银河麒麟V10】linux系统--并挂载镜像
安装【银河麒麟V10】linux系统--并挂载镜像
1575 0
|
6月前
|
关系型数据库 MySQL Linux
卸载、下载、安装mysql(Linux系统centos7)
卸载、下载、安装mysql(Linux系统centos7)
230 0
|
24天前
|
Linux
手把手教会你安装Linux系统
手把手教会你安装Linux系统
|
2月前
|
Ubuntu Linux 网络安全
从头安装Arch Linux系统
本文记录了作者安装Arch Linux系统的过程,包括安装成果展示和遇到的疑难点及其解决方法,如硬盘不足、下载失败、设置时区、安装微码和配置无密码登录等。
从头安装Arch Linux系统
|
4月前
|
Linux 虚拟化 数据安全/隐私保护
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
|
3月前
|
存储 NoSQL Java
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)
该博客文章展示了如何在Linux虚拟机上使用Redis和Jedis客户端实现手机验证码的验证功能,包括验证码的生成、存储、验证以及限制每天发送次数的逻辑,并提供了测试结果截图。
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)
下一篇
无影云桌面