Linux中的静态库和动态库的制作
一.首先来介绍静态库
1静态库其实就是将一些常用的代码和起来打包成为一个库文件,他与动态库的区别只是在调用的过程中的方式不一样而已。
2静态库的命名规则:lib+库名+.a
3.静态库的制作:
1.首先将需要制作静态库的文件生成.o文件:gcc -c *.c
注意我这里的.c文件就是简单的+-*/的实现代码
将.c变成.o文件
2.将生成的.o文件进行打包生成静态库:ar rcs 生成的静态库的名字 + 加所需文件(.o)
命令:nm+动态库名字 查看库中的符号(全局变量,函数)
3.使用静态库:gcc + 源文件 + -I头文件 + libxxx.a
或者使用:gcc + 源文件 + -L 静态库路径 + -l静态库名 + -I头文件目录 + -o 可执行文件名
使用静态库首先需要写一个测试的函数吧,其实就是主函数,下面给大家看一下我的测试函数
下面演示如何使用静态库
方法1.
方法二的调用,为了指定他们的路径,我将test.c测试文件移动在了lianxi文件中
最后说说静态库的优缺点
二.动态库(共享库)
1.动态库的命名规则:lib+库名+.so
2.制作动态库
①将.c生成.o文件,不过这里的.o目标文件是与位置无关的.o文件
什么是与位置无关呢?
解释:程序进行的时候,系统会生成一个虚拟的空间一般来说大小为4g,动态库的代码每次都在共享库区域的不同位置存放(相对地址),这就是与位置无关。因为动态库在程序编译的时候并没有将其代码放到可执行文件中,而是对要使用的共享库中的函数做了标记,在运行的时候通过链接器找到共享库中的具体的函数代码进行调用。
所以下面来演示生成与位置无关的.o文件
2.将.o文件打包成动态库
命令:gcc -shared -o libmytest.so +.o文件
3.对动态库的使用:和静态库的使用方法一样
因为方便演示写动态库的路径问题我将libmytest.so放在dlll目录下面(在调用动态库的时候用可能会出现一下的一些问题,现在我来演示并说名问题如何解决)
为什么会出现上面的错误呢?
解释:因为动态库的调用需要链接器找到动态库从而调用相应的函数,这里的错误就是链接器没有找到我写的这个动态库。使用ldd可以查看可执行程序所依赖的动态链接库。
下面我们来看看detexe所需要的动态库有哪些
因为没有给链接器指定好我的动态库的目录
解决方案有四个下面我来一个一个介绍
方法1:将我 写的libmytest.so移动到系统目录lib中,因为lib是所有动态库的存身之地,链接器会去系统lib目录中寻找
但是这个方法容易和系统中的动态库冲突重复不建议使用,下面我删除lib中的libmytest.so,你注意别删错了,当然not found 又会出现了。这里就不演示了
方法2:给把动态库的路径配置给LD_LIBRARY_PATH的这个环境变量,因为在程序运行时会先去这个环境变量中搜索,然后在去系统默认的lib搜索
不过这个方法的弊端就是他是临时的,当你的终端重启以后就需要再次配置,否则环境配置内容又为空。这个在你测试动态库的时候可以用来临时测试功能的时候用
方法3:把方法3整个配置写在当前用户下的家目录下面的.bashrc文件中,这是永久配置的方法
下面我来演示整个配置过程
方法4:
1.找到动态链接器的配置文件:ld.so.conf
2.把我们制作的动态库写到配置文件中
3.更新配置文件:ldconfig(需要管理员权限),想看配置文件输出内容的话加-v
演示如下:
最后说说动态库的优缺点:
优点:生成的可执行文件体积小
更新方便不需要重新编译可执行文件
缺点:
需要把动态库也提供给用户,因为没有把动态库加载在可执行文件中
速度相对来说能慢点
以上就是linux静态库和动态库的制造方法,有什么问题欢迎留言一起交流学习。