【Linux】gcc/g++

gcc/g++的使用

gcc:C语言编译器,只编译C语言文件
g++:C++编译器,C/C++都可以编译

使用方法:

1.生成默认的可执行文件:a.out

gcc test.c

2.自定义可执行程序的名字

gcc test.c -o 自定义名字

3.使用C99标准来编译

gcc test.c -std=c99

那么生成的可执行程序是什么样的呢?
编译后,会在当前目录生成一个
可执行程序,此文件通常是绿色的

在这里插入图片描述

如何指向代码呢?

输入./a.out

程序翻译的四个阶段

早在C语言阶段我们就已经了解了程序编译的四个阶段,现在我们再来熟悉一下。

预处理阶段

预处理阶段包括四个方面:
1.头文件展开
2.去掉注释
3.条件编译
4.宏替换

接下来用指令验证一下:

gcc -E test.c -o test.i

在这里插入图片描述
vim指令打开test.i文件
在这里插入图片描述

,我们写的代码在最下面
然而上面还有几百行其实就是头文件展开
所谓头文件展开就是:
将头文件的内容拷贝到当前文件
在头文件中有许多空行,这是
因为原先的头文件有注释,此时注释已经没了

编译阶段

编译阶段的主要工作是将C语言翻译为汇编代码。

同样的也可以输入指令验证:
gcc -S test.i -o test.s
将程序停留在编译过程后,生成.s文件

这里就靠大家自行验证了。

汇编阶段

汇编阶段的主要工作是:
将汇编代码变成可重定位二进制文件,文件里存放的是二进制信息。

同样的输入指令:

gcc -c test.s -o test.o

将程序停留在汇编过程后,形成.o文件
在这里插入图片描述

链接阶段

链接阶段比较复杂,它大致的流程是这样的:

.o文件 + 系统库 = 可执行程序

库函数的命名和分类(动静态库)

我们在写C语言代码时使用的printf函数
并没有自己实现,然而在stdio.h头文件中
也只有printf函数的说明,那么此函数的
实现是在哪里实现的呢?

查看一个可执行程序依赖的第三方库。

使用指令: ldd 可执行程序名

在这里插入图片描述
在路径lib64里有一个文件叫libc.so.6,这个就是刚刚的C语言程序所要依赖的库。

如何解释库呢?看到下面这张图片相信会有答案。
在这里插入图片描述
libc.so.6实际上就是C的标准库!

Linux和Windows下动静态库命名区别有什么区别呢?

Linux下: .so 是动态库 .a 是静态库
Windows下: .ddl 是动态库 .lib 是静态库

到了这里相信就可以很容易的理解链接的过程了。
链接过程就是将.o文件和动/静态库结合的过程。

动静态库的区别与优缺点

区别:
动态库是共享库,通过函数地址来关联程序
静态库是私有库,可以独立运行

动态库: 是C/C++或其他第三方提供的所有方法的集合,被所有程序以动态链接的方式关联起来。

静态库: 是C/C++或其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码拷贝至自己的可执行程序当中!

说白了,静态库是将所有代码拷贝过来
而动态库是去找函数的地址调用此函数

动静态库的优缺点: 动态库: 优点:形成的可执行程序体积较小,节省资源 缺点:要找函数地址,会稍慢一点,并且有强依赖性

静态库: 优点:无视库,可以独立运行 缺点: 体积太大,浪费资源

如何当你想使用静态库编译代码该怎么做呢?
只需输入指令: gcc code.c -static即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lehjy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值