之前我们简单使用过了gcc,现在我们联系gcc,学习g++相关的内容
我们先来解决几个问题:
1.版本问题
如果你仔细使用过自己的gcc/g++编译器就会发现,他们如果不经过自己的配置,可能默认的版本会非常古老,所以我们需要自己修改版本,或者通过命令来改变版本问题,由于我们是初学Linux,所以这里建议大家就先使用命令行的方式:
gcc text1.c -std=c99
该命令行就可以实现C99相关的内容,例如:循环初始化可以在()里面写了
注意:如果是g++,可以如下写:
g++ text2.cc -std=c++11
问题二:名字问题
我们生出可执行程序时,通常都是a.out,但是我们可以生成一个自己命名的程序吗?
答案是当然可以,我们可以通过命令行形式来实现它:
gcc text1.c -o text1.exe
例如:
这样我们就可以命名为想要的名字了!!!
好了,现在我们回到g++:
什么是g++?
g++是C++对应的编辑器,gcc是C语言对应的编辑器,但是要注意的是:g++是可以用来编辑C语言文件的,两者使用逻辑大体相同
使用时发现没有安装,该如何解决?
我们可以通过yum来解决问题
sudo yum -y install gcc-c++
如果你是用root账户,就不需要提权了。
我们知道程序环境分为翻译环境和执行环境,下面我们就详细谈谈Linux中的翻译环境
作用:
1.宏替换
2.头文件展开
3.去掉注释
4.条件编译(重要点,可以-D来控制)
命令行:
gcc -E text1.c -o text.i
作用:将高级语言转换为汇编语言
命令行:
gcc -S text1.c -o text.s
作用:将汇编语言转换为二进制语言
命令行:
gcc -c text1.c -o text1.o
作用:链接多个文件,生成可执行文件
命令行:
gcc text.o -o text.exe
我们知道我们是现有二进制语言的,然后再有汇编语言,那么当巴科斯(汇编语言之父)在想出Fortran这个汇编语言的时候,由于没有对应的编译器,那么是如何生出可执行文件的呢?
其实最开始的汇编语言编译器是通过二进制语言来写的,也就是说早期是没有对应的汇编语言编译器的,后来由于汇编语言可以编写之后,在用汇编语言写出对应的编译器,然后转换为二进制语言的
同理,我们所熟知的高级语言也是如此,大家可以适当了解
这个过程叫编译器的自举过程
引入:
我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函
数“printf”了,而这也就是链接的作用
函数库一般分为静态库和动态库两种
在不同的系统下文件后缀是不同的,我们以window和linux为例:
在window下:
动态库:.dll
静态库:.lib
在linux下:
动态库:.so
静态库: .a
下面我们通过问题来解决大家的疑惑:
1.为什么要有链接?
这是大家最常见的问题,大家只需要明白什么是链接,就会知道问题答案了。链接是指我们的程序和库结合的过程,如果没有链接,我们写的printf都需要自己去实现对应的代码,所以正是因为我们可以通过链接的方式来调用别人已经写好的库,可以大大提高程序开发的效率,同时也便捷了我们语言的学习
2.链接中的动态库和静态库有什么区别吗?
对于这个问题,我们要明白两者的定义,动态库是通过访址的形式找到别人写好的内容然后返回所需的内容,而静态库则是在自己的源代码文件中生成对应的库全部内容,这样就不需要拷贝,这就是两者的区别。
3.动静态库的优缺点?
动态:
优点:大大节约资源和空间
缺点:动态库绝对不能丢失,否者大部分的指令或程序都会挂掉
静态:
优点:只要形成,就和库无关,所以有非常好的移植性
缺点:资源和空间消耗大
下面是我们的补充知识:
一般情况下,不管是window还是linux都是默认动态库链接形式,但是如果你想是链接静态库,可以如下操作:
首先我们要下载静态库:
sudo yum -y install glibc-static
这样之后就可以使用静态链接了
gcc text1.c -static -o text-static.o
-static就可以使用静态链接
下面我们动静态对比:
大家可以对比左下角的空间消耗,就会明白为啥都是默认动态链接了
最后,感谢大家的支持!