【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

相关文章
|
10天前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
10天前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
25天前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
22 6
|
14天前
|
Shell Linux Python
python执行linux系统命令的几种方法(python3经典编程案例)
文章介绍了多种使用Python执行Linux系统命令的方法,包括使用os模块的不同函数以及subprocess模块来调用shell命令并处理其输出。
14 0
|
5月前
|
NoSQL Unix Linux
Linux下的系统编程——守护进程、线程(十二)
Linux下的系统编程——守护进程、线程(十二)
63 0
Linux下的系统编程——守护进程、线程(十二)
|
5月前
|
存储 Linux Shell
Linux系统编程(守护进程)
Linux系统编程(守护进程)
63 0
|
NoSQL Ubuntu Unix
linux系统编程(十)守护进程、线程(上)
linux系统编程(十)守护进程、线程
265 0
linux系统编程(十)守护进程、线程(上)
|
存储 Linux 调度
linux系统编程(十)守护进程、线程(下)
linux系统编程(十)守护进程、线程
158 0
|
Linux
Linux系统编程---守护进程
守护进程是什么?就是在后台运行的进程。 那么如何创建守护进程呢?  1. 创建孤儿进程 2. setsid() 创建进程会话 3. 重定向标准输入, 标准输出 4. chdir, 改当当前进程的工作目录 接下来看一个例子: #include #include #include int ...
905 0
|
2天前
|
Linux
Linux的cp命令如何使用?
Linux的cp命令如何使用?
11 5