Yuchuan_Linux_C 编程之四动态库(共享库)制作
一、整体大纲
二、共享库的制作
1. 命名规则:
lib + 名字 + .so
2. 制作步骤:
1) 生成与位置无关的代码 (生成与位置无关的.o)
2) 将.o打包成共享库(动态库)
3. 发布和使用共享库:
4. 解决程序执行时动态库无法被加载的问题:
1)放到系统的库目录 中 -- 不允许使用
2)临时测试
环境变量: LD_LIBRARY_PATH=将动态库的路径设置给该变量
将设置的值, 导入到系统环境变量中: export LD_LIBRARY_PATH
当终端关闭, 设置会失效
3)不常用的方法(永久设置):
在家目录的 .bashrc文件 中添加一句话: export LD_LIBRARY_PATH=动态库目录的绝对路径
.bashrc修改完成, 需要重启终端
4)修改配置文件
a. 需要找动态连接器的配置文件 -- /etc/ld.so.conf
b. 动态库的路径写到配置文件中 -- 绝对路径
c. 更新 -- sudo ldconfig -v
5. 优缺点:
三、动态库的制作示例
1. 制作步骤
(1)编译与位置无关的代码(下图共享库),生成.o目标文件,关键参数 -fPIC
进程虚拟地址空间
(2)将.o文件打包,关键参数 -shared
(3)将库与头文件一起发布
- 生成.o目标文件
文件路径和内容同上,进入到src目录,生成.o目标文件:
[root@centos1 src]# gcc -fPIC -c *.c -I ../include/
[root@centos1 src]# ll
总用量
-rw-r--r--. root root 4月 : add.c
-rw-r--r--. root root 4月 : add.o
-rw-r--r--. root root 4月 : sub.c
-rw-r--r--. root root 4月 : sub.o
- 将.o文件打包生成动态库
[root@centos1 src]# gcc -shared -o libCalc.so *.o
[root@centos1 src]# ll
总用量
-rw-r--r--. root root 4月 : add.c
-rw-r--r--. root root 4月 : add.o
-rwxr-xr-x. root root 4月 : libCalc.so
-rw-r--r--. root root 4月 : sub.c
-rw-r--r--. root root 4月 : sub.o
2. 使用
- 使用生成的动态库,-L 指定动态库路径 -l 指定库名(gcc main.c -o main -I include/ -L ./lib -lCalc)
退出到calc目录下,将动态库拷贝到lib目录下并编译mian.c并执行main:
[root@centos1 calc]# gcc main.c -o main -I include/ -L ./lib -lCalc
[root@centos1 calc]# ll
总用量
drwxr-xr-x. root root 4月 : include
drwxr-xr-x. root root 4月 : lib
-rwxr-xr-x. root root 4月 : main
-rw-r--r--. root root 4月 : main.c
drwxr-xr-x. root root 4月 : src
[root@centos1 calc]# ./main
./main: error while loading shared libraries: libCalc.so: cannot open shared object file: No such file or directory
无法找到动态库目标文件,解决方法有三个:
(1)拷贝到/lib下(不允许,容易与别人库命名重合)
(2)将库路径增加到环境变量LD_LIBRARY_PATH中(不是特别推荐)
[root@centos1 calc]# export LD_LIBRARY_PATH=/home/xuejiale/src/calc/lib/:$LD_LIBRARY_PATH
[root@centos1 calc]# ./main
+ is
- is
(3)配置/etc/ld.so.conf文件,增加 /home/xuejiale/src/calc/lib/ 路径,执行 ldconfig -v,并执行main
/home/xuejiale/src/calc/lib/
[root@centos1 calc]# ./main
+ is
- is
3. 优缺点总结
缺点:
- 执行时需要加载动态库,相对而言,比静态库慢
- 发布应用时需要同步发布动态库
优点:
- 执行程序体积小
- 库变更时,一般不需要重新编译应用
动静态库总结:
静态库特点:
- 库的代码会编译进程序里面,所以静态库编译的程序比较大。
- 由静态库编译的程序不用依赖于系统的环境变量,所以环境变量有没有这个库文件,也可以运行。
动态库特点:
- 库的代码不会编译进程序里面,所以动态库编译的程序比较小。
- 由动态库编译的程序依赖于系统的环境变量有没有这个库文件,没有则运行不了。
最新文章
- 如何在eclipse中通过Juit进行单元测试
- mvc 中的 [ChildActionOnly] 和 [NonAction]
- 表单form的enctype=";multipart/form-data";使用疑惑
- 【译】UNIVERSAL IMAGE LOADER.PART 2---ImageLoaderConfiguration详解
- mapreduce运用
- mysql5.7.12安装过程中遇到的一些问题
- JavaEE下载文件名不显示中文的问题
- 外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样(转)
- java properties 对list的支持
- linux安装oracle笔记
- .h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分
- Nova计算节点安装配置
- Springboot 4.Springboot 集成SwaggerUi
- 转载:Keytool 工具介绍
- python修炼第二天
- js bind0
- P和C
- 绑定Github上的个人博客到Godaddy域名
- ftp环境搭建并创建虚拟用户
- 6 CLR实例构造器