Linux中的静态库和动态库的制作

来源:互联网 发布:c语言return返回值给谁 编辑:程序博客网 时间:2024/06/04 19:08

一.首先来介绍静态库

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静态库和动态库的制造方法,有什么问题欢迎留言一起交流学习。

原创粉丝点击