=========================================================================
个人主页点击直达:小白不是程序媛
Linux专栏:Linux系统学习
=========================================================================
目录
前言
Linux系统下安装gcc和g++
gcc和g++的不同
gcc/g++的使用
gcc/g++选项
预处理
头文件的展开
宏替换
注释的删除
条件的编译
编译
汇编
链接
系统库
库的分类
库的安装
库的命名
C++语言的后缀
前言
上篇文章我们进入Linux系统编程的学习,介绍了代码的编辑器vim多功能编辑器的使用,编辑器的上手还是挺难的,要通过多多练习各个模式的命令集慢慢熟练起来。代码能够编辑后我们就要对代码进行编译运行,在Linux系统中我们使用gcc和g++编译器对我们写的代码进行编译运行。为了深入学习我们将从一个.c的源文件通过预处理、编译、汇编、连接变成我们的可执行程序使用gcc编译器详细呈现。
Linux系统下安装gcc和g++
安装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文件
预处理
源文件编译第一步是进行预处理,其作用为头文件的展开、宏替换、去掉注释、条件编译。
头文件的展开
-E表示预处理后就结束,-o将文件名
头文件include也就900多行,去掉注释在.i的文件中800多行,头文件展开相当于直接将头文件复制在.i文件中
宏替换
直接打开刚才预处理好的.i文件;和.c源文件进行对比。我们会发现我们定义的宏在代码中已经全部替换。
注释的删除
预处理后我们的注释会被删除;
条件的编译
条件编译会根据你设置的条件而删除一些代码。
编译
将代码编译成汇编代码
-S表示进行到程序的编译,编译完成即可停止。
左边为我们的初始源文件,右边为执行完编译后的文件,为汇编代码。
汇编
将汇编代码转化为二进制代码。
-c表示执行到汇编结束后就停止。
左边为我们的初始源文件,右边为执行完汇编后的文件,为二进制代码。
链接
通过上面我们可以的到一个.o文件
虽然.o文件时二进制依然执行不了,需要进行链接。链接是将我们的.o文件和系统库链接起来。
链接起来便可以执行。
系统库
我们现在所写的代码和各种编译器如何编译都是通过很多的年的发展所形成的,编写代码的过程中有很多我们不需要实际完成的函数,像输入,输出函数、字符串相关的函数等等,是系统帮助我们实现的。是以库的形式呈现给我们的。
库的分类
动态库
是C/C++或者其他第三方提供所有方法的集合,被所有程序以链接的方式,动态关联起来。
优点:形成的可执行程序体积比较小,比较节省资源
缺点:稍微慢一些,强依赖动态库,动态库没了,所有的依赖这个库的程序都无法运行了
静态库
是C/C+或者其他第三方提供的所有方法的集合,被所有的程序以拷贝的方式,将需要的代码拷贝到自己的可执行程序中,静态关联起来。
优点:无视库,可以独立运行
缺点:体积太大,浪费资源
库的安装
系统一般默认是不会安装静态库的,只有动态库。
使用static我们可以使用静态库,但是我们没有安装静态库,执行不了。
C动态库安装
yum install glibc-static
使用静态库后我们明显看到体积会变大。
C++静态库安装
yum install libstdc++-static
库的命名
.so :动态库 XXX.dll
.a:静态库 XXX.lib
C++语言的后缀
.cpp
如上图我们使用gcc编译.cpp文件是编译不过去的
.cc
.cxx
今天代码的编译器gcc/g++的分享到这里就结束了,我们以如何从一个.c文件到可执行程序的四个过程为例展示我们gcc/g++的使用。大家看完文章后结合上篇文章自己在Linux下编写一个代码可以试试。希望大家读完文章有很大的收获,也希望大家留言指出我文章中出现的内容,同时也感谢各位看官的三连支持,你们的支持就是我更新的动力!!!
下篇预告:make/Makefile(自动化构建代码)