15.2.1.1静态库与动态库原理,编译流程详解

1.编译原理


图片发自App


图片发自App


图片发自App


图片发自App


图片发自App



图片发自App



图片发自App



图片发自App



图片发自App

2.下面我们去linux系统去练习编译的4个流程

演示如下:

当前目录创建一个c文件,并且查看内容


图片发自App

预处理

并且通过ls命令查看当前文件目录,发现生成i文件

图片发自App

编译

生成s文件也就是汇编文件

图片发自App

汇编

生成目标文件,也就是o文件


图片发自App


链接

生成可执行文件test


图片发自App

执行这个文件


图片发自App


发现成功执行了我们的代码

事实上我们也可以通过gcc命令直接讲.c文件直接生成可执行文件

首先我们先讲生成的目标文件删除


图片发自App

然后直接将c文件直接生成可执行文件


图片发自App

发现,同样可以生成可执行文件test


图片发自App


执行


图片发自App

同样,我们的源代码被执行了

3.静态库

图片发自App


图片发自App

4.动态库


图片发自App


图片发自App

5.接下来我们去lunix系统中操作一下如何编译和生成静态库和动态库

(1)静态库

首先在当前目录创建3个文件如下


图片发自App

分别查看3个文件的内容


图片发自App

将tool.c生成目标文件


图片发自App

生成目标文件gcc命令如果省略-o tool.o,默认生成一个和tool同名的o文件


图片发自App

由tool.o文件生成静态库文件


图片发自App

发现生成了一个libtool.a的文件

接下来,需要编译可执行文件,链接静态库


图片发自App

执行main


图片发自App


使用ls lh来查看详情


图片发自App


可以发现libtool.a只有1.5k而main却有8.4k

为什么会多出来这么多呢

可以使用ldd main来查看可执行文件依赖了哪些库


图片发自App

以上就是如何标准静态库和使用静态库的过程

(2)动态库

同上先将tool.c编译成目标文件tool.o

前面我们已经生成了,这里我们就不在生成了

接下来将.o文件生成动态库


图片发自App

接下来我们来编译可执行文件,和链接到动态库


图片发自App

这里和前面静态库一样

那么问题来了,静态库和动态库同名怎么办?

答:当静态库和动态库同名的时候,gcc会优先加载动态库


图片发自App


执行main发现报错了

执行ldd main


图片发自App

执行之前需要设置环境变量

该环境变量主要用于查找共享库

也就是动态链接库时,除了默认路径以外的其他路径

我们的动态so库没有在默认路径,而是在当前路径一下,所以出现库找不到,所以我们需要设置环境变量


图片发自App


图片发自App


图片发自App

你可能感兴趣的:(15.2.1.1静态库与动态库原理,编译流程详解)