Linux

一.g++

之前我们简单使用过了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

例如:

Linux_第1张图片

这样我们就可以命名为想要的名字了!!!

好了,现在我们回到g++:

什么是g++?

g++是C++对应的编辑器,gcc是C语言对应的编辑器,但是要注意的是:g++是可以用来编辑C语言文件的,两者使用逻辑大体相同

使用时发现没有安装,该如何解决?

我们可以通过yum来解决问题

sudo yum -y install gcc-c++

如果你是用root账户,就不需要提权了。

二.生成可执行文件四大步骤详解

我们知道程序环境分为翻译环境和执行环境,下面我们就详细谈谈Linux中的翻译环境

1.预处理

作用:

1.宏替换

2.头文件展开

3.去掉注释

4.条件编译(重要点,可以-D来控制)

命令行:

gcc -E text1.c -o text.i

2.编译

作用:将高级语言转换为汇编语言

命令行:

gcc -S text1.c -o text.s

3.汇编

作用:将汇编语言转换为二进制语言

命令行:

gcc -c text1.c -o text1.o

4.链接

作用:链接多个文件,生成可执行文件

命令行:

gcc text.o -o text.exe

5.扩展知识

我们知道我们是现有二进制语言的,然后再有汇编语言,那么当巴科斯(汇编语言之父)在想出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就可以使用静态链接

下面我们动静态对比:

Linux_第2张图片

大家可以对比左下角的空间消耗,就会明白为啥都是默认动态链接了

最后,感谢大家的支持!

你可能感兴趣的:(linux,运维,服务器)