动态库制作


动态库
(共享库)

动态库 (共享库)........................................................................................................... 1

1.      描述.............................................................................................................................. 2

1.1.      机制...................................................................................................................... 2

1.1.1.       共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。..................................................................................................................... 2

1.2.      优点...................................................................................................................... 2

1.2.1.       节省内存(共享)....................................................................................... 2

1.2.2.       易于更新(动态链接)............................................................................... 2

1.3.      缺点...................................................................................................................... 2

1.3.1.       延时绑定,速度略慢................................................................................... 2

1.4.      使用场合.............................................................................................................. 2

1.4.1.       对速度要求不是很强烈的地方都应使用动态库....................................... 2

1.5.      注意事项.............................................................................................................. 2

1.5.1.       动态库是否加载到内存,取决于程序是否运行。................................... 2

2.       命名格式..................................................................................................................... 2

2.1.      lib开头................................................................................................................. 2

2.2.      动态库名.............................................................................................................. 2

2.3.      .so 结尾................................................................................................................ 3

3.       制作............................................................................................................................. 3

3.1.      生成“与位置无关”的目标文件........................................................................... 3

3.1.1.       gcc -fPIC a.c b.c c.c -c.................................................................................... 3

3.2.      制作动态库.......................................................................................................... 3

3.2.1.       gcc -shared -o libmytest.so a.o b.o c.o.......................................................... 3

3.3.      使用动态库.......................................................................................................... 3

3.3.1.       gcc main.c -L./ -lmytest -I./ -o app................................................................ 3

3.4.      执行生成的可执行文件...................................................................................... 3

3.4.1.       ./app --> 运行失败....................................................................................... 4


1.      描述

1.1.         机制

1.1.1.          共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

1.2.         优点

1.2.1.          节省内存(共享)

1.2.2.          易于更新(动态链接)

停止运行程序
使用新库覆盖旧库(保证新旧库名称一致,接口一致) “接口”
重新启动程序。

1.3.         缺点

1.3.1.          延时绑定,速度略慢

1.4.         使用场合

1.4.1.          对速度要求不是很强烈的地方都应使用动态库

1.5.         注意事项

1.5.1.          动态库是否加载到内存,取决于程序是否运行。

2.      命名格式

2.1.         lib开头

2.2.         动态库名

2.3.         .so 结尾

3.      制作

3.1.         生成“与位置无关”的目标文件

3.1.1.          gcc -fPIC a.c b.c c.c -c

参数 -fPIC 表示生成与位置无关代码
执行完毕后生成一系列的 .o 文件

3.2.         制作动态库

3.2.1.          gcc -shared -o libmytest.so a.o b.o c.o

参数:-shared 制作动态库
-o:重命名生成的新文件

3.3.         使用动态库

3.3.1.          gcc main.c -L./ -lmytest -I./ -o app

-L --> 指定库所在的路径
去掉前缀 lib
去掉后缀 .so
只留下中间部分
-I --> 头文件目录位置

3.4.         执行生成的可执行文件

3.4.1.          ./app --> 运行失败

查看依赖的共享库:ldd app 发现 libmytest 找不到
没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径
解决方案
1. 临时设置:exportLD_LIBRARY_PATH=库路径,将当前目录加入环境变量,但是终端退出了就无效了。
2. 永久设置:将上条写入家目录下.bashrc文件中
3. 粗暴设置:直接将libmytest.so文件拷贝到/usr/lib/【/lib】目录下。(受libc库的启发)
4. 将libmytest.so所在绝对路径追加入到/etc/ld.so.conf文件,
   使用sudoldconfig -v 更新


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值