目录
什么是gcc、g++
gcc、g++ 相关操作详解
预处理、编译、汇编、链接来源
动静态链接是什么
结语
什么是gcc、g++
gcc、g++其实就是编译器,是帮助我们从.c或者.cc,.cpp文件编译成可执行程序的
其中,我们如果要编译c语言文件的话,上面两个我们都可以使用,虽然g++是用来编译cpp的,但是cpp本身就包含了c语言
但是我们并不能使用gcc来编译cpp文件,会报错的,
接着我们来快速见一下gcc、g++的用法(其实这两个用法是差不多的,所以接下来主包就只展示gcc的用法):
这上面我们用到了一个 -o 的选项,这其实就是在给生成出来的可执行程序进行一个命名
如果我们不加上 -o 选项的话,那么他会默认将名字改成a.out
gcc、g++ 相关操作详解
这里要声明一下,由于gcc、g++底层用的是同样的东西,只不过默认处理的语言不同,仅此而已,所以我们gcc进行的操作,g++同样也有,也可以进行
所以,下面主包也同样是用gcc进行演示
首先,我们的程序要从.c文件变成可执行程序,一共需要经历四步:
预处理、编译、汇编、链接
对应在gcc中的操作是:
预处理:gcc -E test.c -o test.i
编译:gcc -S test.i -o test.s
汇编:gcc -c test.s -o test.o
链接:gcc test.o -o test
其实挺好记的,选项就是ESc,其实就看向键盘最左上角,有一个Esc退出键
而对应后缀就是iso,记着就好了
接着我们来详细谈一谈这四个步骤,以及为什么是四个步骤而不是一步到位
预处理
其实这个步骤就干几件事情:宏替换,去注释,头文件展开,条件编译等等
我们可以简单来看一看:
我们可以看到,左边是test.c,右边是.i,而我们左边就12行,到了右边就变成了800多行了,其实在预处理这一步,就是将上面的头文件展开,注释去掉等等而已
但还有一个,什么是条件编译?
其实就和名字一样,根据不同的条件,编译不同的代码:
就是这样的
编译
编译其实就干一件事情,将C语言转变成汇编代码
而我们上面预处理那一步,其实还是c语言,只不过变得非常干净而已
但是这一步,却是将c变成汇编,如下图:
我们用vim打开来看看这个.s文件
汇编
这一步传自上一步编译,这一步就是将汇编翻译成二进制
这里就不用vim打开来看了,因为二进制要看的话只会看到乱码
链接
到了最后一步链接这里,其实就是将.o文件(在Windows下可能叫做.obj)变成可执行程序
预处理、编译、汇编、链接来源
可能有人会疑惑,你说预处理我能理解,这样看起来还是比较整洁,替换一下我觉得没有问题
但是剩下三步是为什么?为什么不能一步到位直接形成可执行程序?
这里我们就需要讲一讲历史渊源了
在最开始的时候,电脑刚出来的时候,我们是用二进制进行编程的
就是像这样的
但是由于这样子太麻烦了,所以就出现了汇编语言
但是我们汇编的底层还是二进制
接着就是c语言的出现
我们当然可以直接从c变成可执行,但是这样太麻烦,因为最底层还是二进制,但是如果我们只是将出c变成汇编的话,汇编到二进制那一步我们就不需要做了,因为历史帮我们完成了,所以效率就很高
所以有四步一方面是历史原因,另一方面就是效率高了
另外还有一个有意思可以拓展一下的就是:编译器的自举
问一个问题,是有汇编语言,还是先有汇编语言的编译器?
答案当然是现有汇编语言,不然的话汇编对应的编译器的语法检查等等东西怎么写?
但是在最开始的时候,我们只有语言,没有对应的编译器,所以我们就会先用二进制写一个匹配汇编的编译器,接着就是,我们再用这个二进制写成的汇编编译器再写一个用汇编语言写出来的汇编编译器
这时,我们的编译器就出来了,c语言同样如此,这就叫做编译器的自举
动静态链接是什么
首先是操作,动态链接的话是默认的,你用gcc默认就是动态链接
如果你要静态链接的话,需要在gcc指令的最后面加上-static
但是可能会遇到如下这种情况:
这代表静态库没有安装,因为可能有些默认就是没有静态库的,用yum安装即可
然后要安装哪一个库就搜一下对应指令即可,因为一般用不到这个,所以其实不太需要安装
接着我们需要知道,我们的项目中会包含很多头文件,但是我们在编译的时候,会先通过预处理找到库然后将库展开代替到项目中的
这就说明,我们的云服务器中,系统中,是一定有对应的库的,这样我们才能说去找到他
而在Linux中,我们可以用 ldd 命令来查看
我们可以看到,这里面用到的就是c语言的标准库
同时我们还可以用file指令看看,具体的链接方式:
这里可以看到,就是动态链接
但是我们还需要知道,什么是动静态链接?
举个例子,学校外面有一个网吧,当到了周末的时候,同学们都会去到网吧里面用电脑,因为学校没有(假设),这时候,我们的网吧就是动态库,而同学们去网吧的这个过程,就叫做动态链接
而静态链接就是,没有网吧,但是在学生宿舍里面每一个人都有一台电脑,这时候不管外面有没有网吧,同学们都不会出去了,因为电脑直接就有了,这就是静态链接
而在我们的Linux中,最主要的就是动态链接,因为动态链接的优点就是,我们的库(网吧)只需要有一个就够了,会省空间,提高效率,但是缺点就是,当我们的这个对应的库被误删的时候,可能会有几百上千个文件(同学)同时用不了(上不了网)
而静态库的优缺点则是相对的,因为这是直接将库给每个人配一个了
这是动静态库大小的对比
我们可以看到的是,这里面都是用到的动态库,因为本身静态库的效率就不高,从这里我们就可以看到Linux对于动静态库的态度了
结语
这篇文章到这里就结束啦!!~( ̄▽ ̄)~*
如果觉得对你有帮助的,可以多多关注一下喔