【Linux】gcc/g++编译器原理

目录

1、背景知识

2、gcc/g++编译过程

2.1、预处理

2.2、编译

2.3、汇编

2.4、链接

3、函数库

3.1、动态链接

3.2、静态链接

1、背景知识

1.1、gcc是一个专门用来编译链接C语言的,g++是用来编译链接C++的

1.2、默认centos7.6默认匹配gcc版本4.8

1.3、要生成可执行程序 ,只要是-o后面紧跟着的就是我们要形成的可执行程序,剩下的都是我们要编译的源文件

gcc mytest.c -o mytest 
//生成mytest可执行程序

1.4、Linux命令行 gcc -v /g++ -v 查看gcc/g++版本,如果没有g++,执行命令按照g++

sudo yum install -y gcc-c++

程序运行起来要经过预处理、编译(生产汇编)、汇编(生成机器可识别代码)、链接(生成可执行文件或库文件)。

2、gcc/g++编译过程

2.1、预处理

预处理过程:a、去注释 b、头文件展开c、 宏替换 d、条件编译

选项"-o"是指目标文件,”-i“文件为已经经过预处理的c原始程序

当编译时,头文件内容拷贝到源文件中,头文件预处理阶段把内容拷贝到源文件中

#pragma once 防止头文件包含

gcc -E mytest.c -o mytest.i

2.2、编译

将C代码转换成汇编代码

使用"-S"选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码

gcc -S mytest.i -o mytest.s

2.3、汇编

汇编阶段把编译阶段生成的”.s“文件转换成目标文件

使用"-c"选项可以查看汇编代码已经转换成".o"的二进制目标代码

gcc -c mytest.s -o mytest.o

//执行 od mytest.o 进行查看二进制文件

2.4、链接

再成功编译编译之后,进入了链接阶段

gcc mytest.o -o mytest

3、函数库

1、我们的C程序中,并没有定义“printf”的函数实现,而且再预编译中包含的“stdio.h”中只有该函数的声明,而没有定义函数的实现,那么“printf”是在哪里实现的?

2、实际上系统把这些函数实现都放到名为libc.so.6的库文件中,在没有特别指定时,gcc会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这样就实现函数“printf”了,体现出了链接的作用。

3、自己形成的mytest可执行程序,实际上依赖的是stdio.h头文件,通过头文件找方法的声明,在库中找方法的实现,把我的代码和库中的代码以某种方式关联起来,形成一个可执行程序。

vim /usr/include/stdio.h
#查看提供C语言的方法声明
ll /lib64/libc-2.17.so
#查看提供C语言方法的实现
ldd mytest
#查看依赖的库文件
file mytest
#查看多少位的可执行程序以及动静态链接

在Linux下,.a(静态库) .so(动态库)

Window下,.dll(动态库) .lib(静态库)

一般动态链接的过程,是有两种方式的:

3.1、动态链接

a、动态链接-需要动态库-将库中方法的地址,填入我的可执行程序中,建立关联,在程序执行时由运行时链接文件加载库,其优点是能够节省系统开销。动态库一般后缀名为".so","libc.so.6"就是动态库,gcc在编译时默认使用动态库。完成链接后,gcc生成可执行程序

3.2、静态链接

b、静态链接-需要静态库-将库中方法的实现,真的把库文件代码拷贝到我的可执行程序中,因此生成的文件比较大,但在运行时也就不需要库文件了,其缺点是占用资源,其后缀名一般为“.a”。

c、如果静态链接失败,可能是没有静态库,动态链接必须使用.so动态库文件,静态链接必须要使用.a静态库文件。执行下面命令行按照静态库

sudo yum install -y glibc-static
#C静态库
sudo yum install -y libstdc++-static
#C++静态库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值