动态库制作

来源:互联网 发布:整站源码带数据下载 编辑:程序博客网 时间:2024/06/14 00:18


动态库
(共享库)

动态库 (共享库)........................................................................................................... 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 0
原创粉丝点击