美文网首页
15.2.1.1静态库与动态库原理,编译流程详解

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

作者: saygoodbye_e92e | 来源:发表于2019-07-14 13:32 被阅读0次

    1.编译原理

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

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

    演示如下:

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

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

    预处理

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

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

    编译

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

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

    汇编

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

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

    链接

    生成可执行文件test

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

    执行这个文件

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

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

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

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

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

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

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

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

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

    执行

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

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

    3.静态库

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

    4.动态库

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

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

    (1)静态库

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

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

    分别查看3个文件的内容

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

    将tool.c生成目标文件

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

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

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

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

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

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

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

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

    执行main

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

    使用ls lh来查看详情

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

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

    为什么会多出来这么多呢

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

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

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

    (2)动态库

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

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

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

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

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

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

    这里和前面静态库一样

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

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

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

    执行main发现报错了

    执行ldd main

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

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

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

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

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

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

    相关文章

      网友评论

          本文标题:15.2.1.1静态库与动态库原理,编译流程详解

          本文链接:https://www.haomeiwen.com/subject/bxbbkctx.html