1.编译原理
2.下面我们去linux系统去练习编译的4个流程
演示如下:
当前目录创建一个c文件,并且查看内容
预处理
并且通过ls命令查看当前文件目录,发现生成i文件
编译
生成s文件也就是汇编文件
汇编
生成目标文件,也就是o文件
链接
生成可执行文件test
执行这个文件
发现成功执行了我们的代码
事实上我们也可以通过gcc命令直接讲.c文件直接生成可执行文件
首先我们先讲生成的目标文件删除
然后直接将c文件直接生成可执行文件
发现,同样可以生成可执行文件test
执行
同样,我们的源代码被执行了
3.静态库
4.动态库
5.接下来我们去lunix系统中操作一下如何编译和生成静态库和动态库
(1)静态库
首先在当前目录创建3个文件如下
分别查看3个文件的内容
将tool.c生成目标文件
生成目标文件gcc命令如果省略-o tool.o,默认生成一个和tool同名的o文件
由tool.o文件生成静态库文件
发现生成了一个libtool.a的文件
接下来,需要编译可执行文件,链接静态库
执行main
使用ls lh来查看详情
可以发现libtool.a只有1.5k而main却有8.4k
为什么会多出来这么多呢
可以使用ldd main来查看可执行文件依赖了哪些库
以上就是如何标准静态库和使用静态库的过程
(2)动态库
同上先将tool.c编译成目标文件tool.o
前面我们已经生成了,这里我们就不在生成了
接下来将.o文件生成动态库
接下来我们来编译可执行文件,和链接到动态库
这里和前面静态库一样
那么问题来了,静态库和动态库同名怎么办?
答:当静态库和动态库同名的时候,gcc会优先加载动态库
执行main发现报错了
执行ldd main
执行之前需要设置环境变量
该环境变量主要用于查找共享库
也就是动态链接库时,除了默认路径以外的其他路径
我们的动态so库没有在默认路径,而是在当前路径一下,所以出现库找不到,所以我们需要设置环境变量