深度解析Linux中的编译器gcc/g++

gcc只用来编译C语言

g++用来编译C/C++

程序的翻译步骤经历四个过程的

1、预处理(进行宏替换/去注释/条件编译/头文件展开等)


这个-E的意思是从现在开始,进行程序的翻译,一但预处理做完了,就停下来

那么这里的code.i保存的是预处理之后的结果

我们这里的-o选项就是指明了我们的生成文件的名称了

那么我们将这个code.i文件和原始的code.c进行对比下


对比发现我们的源文件有24行,预处理结算的代码有800多行

我们在这个阶段进行了进行宏替换/去注释/条件编译/头文件展开等等操作

所谓的头文件展开就是将你要包含的头文件的相关内容拷贝到我们的源文件里面

2、编译(生成汇编)

输入命令gcc -S code.i -o code.s

生成了一个code.s的文件

那么这个文件里面的都是汇编语言了

这个-S的意思即是从现在开始进行程序翻译,编译做完,形成汇编,就停下来

3、汇编(生成机器可以识别的代码)

输入命令gcc -c code.s -o code.o

-c的意思是开始进行程序的翻译,汇编完成就停下来

我们生成的code.o文件是不能执行的,并且可以重定位目标二进制文件的

4、链接(生成可执行文件或者库文件)

我们的.o,库文件进行链接,然后就能进行执行的操作

我们可以通过ESc来记住这个前面三个过程的选项

那么分别形成的文件的后缀就是.iso了

如果我们出现这种情况的话,那么就是说明系统觉得我们没有权限

所以我们是需要进行配置文件的更改操作的

我们需要进入到/etc/sudoers这个文件里面,我们需要使用我们的root账户,不然得话我们进去之后什么都看不见的

我们使用su切换到管理员然后进入到我们的vim模式

对文件进行修改,我们输入99gg直接跳转到第99行就行了

然后我们将root那一行进行复制

然后再粘贴到下面,将我们其他的用户名输入进去我们再输入:wq!就行了

强制保存退出

然后我们的配置文件就修改成功了

那么我们的文件就能进行文件的创建和查看的操作了

为什么我们需要进行汇编呢?

减少语言开发的成本

下面的就是编译器自举的操作

动静态库和动静态库链接
库:动态库、静态库

在Linux中的动态库的文件—libXXX.so

在Linux中的静态文件----libXXX.a

在Windows中的动态库—XXXX.dill

在Windows中的动态库—XXXX.lib

如果我们使用的是gvv -c code.c的话,我们没有在后面指定上我们的文件名称的话,那么就会生成同名的.o文件

[kk@hcss-ecs-28de lesson5]$ gcc -c code.c
[kk@hcss-ecs-28de lesson5]$ ll -al
total 16
drwxrwxr-x 2 kk kk 4096 Dec 27 14:49 .
drwx------ 5 kk kk 4096 Dec 27 14:47 ..
-rw-rw-r-- 1 kk kk   69 Dec 27 14:47 code.c
-rw-rw-r-- 1 kk kk 1504 Dec 27 14:49 code.o
[kk@hcss-ecs-28de lesson5]$ 

前面的知识:我们的这个code.o是不能进行执行的操作的,我们是需要进行链接的

我们可以再次进行gcc code.o -o mycode的可执行文件

这个操作我们叫做链接了

一点开始链接了,那么就形成了一个mycode的文件

我们使用ldd mycode来进行查看我们是否存在这个链接成功了


那么我们根据这个链接找到的就是这个libc- 2.17.so

这个就是我们的C标准库


gcc会帮你进行c语言的库的链接操作部

[kk@hcss-ecs-28de lesson5]$ file mycode 
mycode: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=8bbc1c98d1da83282c41f5b2eca3a7a97847630a, not stripped
[kk@hcss-ecs-28de lesson5]$ 

这里我们可以发现我们这里的是动态链接

那么我们如何行成静态链接呢?

我们输入命令gcc code.o -o mycode -static

那么这个就是采用静态链接的方案

所以gcc默认形成的可执行程序是动态链接的

gcc -static:我们要求程序进行静态链接

我们这里如果要使用动态链接的话就要使用动态库

如果要使用静态链接的话就使用静态库


需要存在对应的库,我们的Linux默认只存在动态库

sudo yum install glibc-static libstdc++-static -y我们可以使用这个命令进行静态库的安装操作

形成的可执行程序里面的static的体积比较大,

动态链接就是将库的地址拷贝到我们的可执行程序里面,动态库也称之为共享库

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