Linux下动态库的制作

Linux下动态库的制作

动态库介绍

DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
注意:动态库文件再Windows下文件名后缀为 .dll ,而在Linux下文件名后缀为 .so
动态库的命名遵循libXXX.dll 或者libXXX.so

动态库的优点

DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地址,最后进行调用。使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从DLL中取出。另外,使用DLL文件还可以减小程序的体积。

动态库的缺点

使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统死掉。

Linux动态库的制作

  1. 对源文件进行编译,获得结果文件( .c文件变成 .o文件)
  2. 将.o文件制作成动态库文件
  3. 编译测试文件test.c 同时链接制作的动态库

1.对源文件进行编译
源文件
进行编译

gcc -c add.c -o add.o
gcc -c div.c -o div.o
gcc -c mlt.c -o mlt.o
gcc -c sub.c -o sub.o

编译完成
制作动态库文件

//所用指令
//gcc [-shared] -fPIC -o libmylib.so mylib.o 
//这里的-shared是默认的,不写也可以 ;-fPIC 创建与地址无关的编译程序

gcc -shared -fpic -o liatest.so add.o sub.o div.o mlt.o 
//libtest.so 为生成的目标文件 

生成结果
这时动态库已经生成成功,我们对测试文件进行编译并测试是否可以运行

gcc test.c  -I./ -L./ -ltest -o test.out
// -L库的路径 -l库名,注意库名是去掉前缀lib和后缀.so之后的名字

测试文件编译结果
我们尝试运行生成文件

./test.out

运行错误
结果报错,无法找到动态库文件libtest.so,这是因为我们没有把这个动态库加入到系统库中,因此需要配置我们的动态库路径。
这里有四种方法

  1. 直接把我们制作的动态库加入到系统库目录中
  2. 暂时把我们的动态库路径导入系统变量中(只暂时生效)
  3. 把我们的动态库路径导入系统变量(一直生效)
  4. 用软链接将我们的动态库导入到系统库

第一种方法我们一般不推荐这么做,第二种适合于临时使用,第三种方法适合于长久配置。第四种方法是最推荐的,这个方法的好处:动态库进行更新时,会把目录下的一起更新,不需要额外操作;不推荐把动态库拷贝至该目录下,因为更新时需要把该目录下的都更新。

// /home/ubuntu/2static为我的动态库所在的路径
//方法二
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/2static
//方法四
vim ~/.bashrc
//然后在最后一行添加如下内容
export LD_LIBRARY_PATH=/home/ubuntu/2static 
方法三:
sudo ln -s /home/ubuntu/2static/libtest.so /lib/libtest.so

添加完动态库路径后,我们可以用 ldd命令来查看一下
添加完路径后结果
可以看到动态库libtest.so已经指向了正确的路径
我们再次尝试运行测试文件
在这里插入图片描述
成功运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值