因为我们在写代码的时候,不可能每个代码都要重新开始写,我们可以使用别人写好的,成熟的代码,所以,库的存在就变得非常有意义。linux的下的库主要有俩种,一个是动态库,一个是静态库。
1简介
将一个程序编译成可执行程序要经过预编译,编译,汇编,和链接这个几个步骤,而动态库和静态库的主要区别就是在链接阶段怎么处理这些库。
静态库在程序编译的时候会被链接到目标文件当中,在程序运行的时候不在需要这些库,程序移植方便,但是更新会很麻烦,可执行文件比较大,浪费空间,而动态库在编译的时候并不会链接到目标文件中去,所以程序在运行的时候还需要这些动态库的存在。可执行程序比较小,但是程序在运行的过程中必须提供相应的库。
2实验操作
实验一:静态库的制作和使用
实验目标:制作一个静态库并使用。
实验内容:
静态库的制作主要有以下几个步骤:
1,生成目标文件。
2,使用ar命令创建静态函数库。
命名规则:
必须是lib[库的名字].a,括号里面的为你的库的名字,扩展名为.a
使用方法:
在使用gcc编译的时候加上参数-L 和你的库的路径和你要链接的库。
我们创建一个文本并输入以下代码。
![003e7f93009c0c776cd9fb4a2f561822.png](https://i-blog.csdnimg.cn/blog_migrate/f2fb384101e3290d8a6a645ff161923c.jpeg)
将这个文件放进ubuntu中。生成目标文件,输入以下命令:
![07e97dc8e2dc5124404fc07b256f0a79.png](https://i-blog.csdnimg.cn/blog_migrate/6905139697e03d57463bd13246275fdc.jpeg)
输入以下命令创建静态库, -c是创建的意思,-是替换的意思。
![ac5217872916c1776557c7c37c9b3f51.png](https://i-blog.csdnimg.cn/blog_migrate/677509426433c68449d00678b6364282.jpeg)
在当前目录创建一个文件输入以下代码:
![d3bdd29fc21ed69faff12a2541eff004.png](https://i-blog.csdnimg.cn/blog_migrate/feb0502a9a14e38b5630c0a5446fc85f.jpeg)
接着在ubuntu上编译这个程序,编译的时候链接我们上面那生成的库,输入以下命令:
![997475b928fc840590a17cf1362fd84a.png](https://i-blog.csdnimg.cn/blog_migrate/0c63b234745cea4ad264faccaef19224.jpeg)
实验二:动态库的制作和使用
实验目标:制作一个动态库并使用。
实验内容:
动态库的制作主要有以下几个步骤:
1,生成目标文件。
2,生成动态库。
命名规则:
lib[库的名字].so,括号里面的为你的库的名字,扩展名为.so
使用方法:
将生成的库放在/usr/lib 或者 /lib下面去。
在实验一的lib.c基础上,输入下图命令,-fPIC表示与源码位置无关,-shared 生成动态库
![0eeb1cdce45da75aef712d45c0785f43.png](https://i-blog.csdnimg.cn/blog_migrate/47e6957a249cb8b1090cf5963b93d1cb.jpeg)
编译test.c。输入以下命令
![bd56b6472c7f1f9103fe4708b8361125.png](https://i-blog.csdnimg.cn/blog_migrate/4df089d92caa9420065705c76753c77b.jpeg)
运行可执行文件test发现不可以运行成功,提示如下:
![d9a8aa38bbf325a14d8071282aea28d5.png](https://i-blog.csdnimg.cn/blog_migrate/9da3775f3ecdb2dfdc34cf6257ae6952.jpeg)
因为Linux会默认在/usr/lib 或者 /lib下面找,但是我们的库并不在这俩个路径下面,我们将我们生成的库拷贝到/usr/lib下面去,然后我们在运行我们程序。
![d753707d66123b1aa5f1a8e26d149ee4.png](https://i-blog.csdnimg.cn/blog_migrate/c2ee81710b6f1f9578d381b055ea9942.jpeg)
运行程序:
![7c01da11a1381df703073c0445d43d58.png](https://i-blog.csdnimg.cn/blog_migrate/88a44caac854054c517143aa5e01f278.jpeg)
3实验分析
通过实验我们可以发现,使用动态库编译生成的可执行文件要比静态库的要小。
使用动态库:
![9849a78440233c3e080eb295c00d6f92.png](https://i-blog.csdnimg.cn/blog_migrate/a4c9599ed40f67dde52ece008b0db791.jpeg)
使用静态库:
![4241fad028dc64f7ce99b08d5e198f6c.png](https://i-blog.csdnimg.cn/blog_migrate/e79416333d75e0d3f0338421a01579e1.jpeg)
另外我们在编译的时候参数-L 是用来指定库的搜索路径,-l是用来指定要链接的库的名字.
![721aa0263a4ff026692ae9363c9acf15.png](https://i-blog.csdnimg.cn/blog_migrate/70c6c1673fbcd7233777071e276a7b93.jpeg)
这个库的名称是什么,就是我们起的库的名字,如下:
![d298a2536cc1147058b648c8b088e5a6.png](https://i-blog.csdnimg.cn/blog_migrate/16d18f42630545e8df2db1e6dcdd801d.jpeg)
开发利器:迅为IMX6开发板 新增ubuntu16,安卓6.0,新增Yocto,新增设备树相关历程