一、整体大纲

二、共享库的制作

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. 优缺点总结

缺点:

  • 执行时需要加载动态库,相对而言,比静态库慢
  • 发布应用时需要同步发布动态库

优点:

  • 执行程序体积小
  • 库变更时,一般不需要重新编译应用

动静态库总结:

静态库特点:

  • 库的代码会编译进程序里面,所以静态库编译的程序比较大。
  • 由静态库编译的程序不用依赖于系统的环境变量,所以环境变量有没有这个库文件,也可以运行。

动态库特点:

  • 库的代码不会编译进程序里面,所以动态库编译的程序比较小。
  • 由动态库编译的程序依赖于系统的环境变量有没有这个库文件,没有则运行不了。

最新文章

  1. 如何在eclipse中通过Juit进行单元测试
  2. mvc 中的 [ChildActionOnly] 和 [NonAction]
  3. 表单form的enctype="multipart/form-data"使用疑惑
  4. 【译】UNIVERSAL IMAGE LOADER.PART 2---ImageLoaderConfiguration详解
  5. mapreduce运用
  6. mysql5.7.12安装过程中遇到的一些问题
  7. JavaEE下载文件名不显示中文的问题
  8. 外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样(转)
  9. java properties 对list的支持
  10. linux安装oracle笔记
  11. .h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分
  12. Nova计算节点安装配置
  13. Springboot 4.Springboot 集成SwaggerUi
  14. 转载:Keytool 工具介绍
  15. python修炼第二天
  16. js bind0
  17. P和C
  18. 绑定Github上的个人博客到Godaddy域名
  19. ftp环境搭建并创建虚拟用户
  20. 6 CLR实例构造器

热门文章

  1. xpath-helper 插件下载
  2. 虚拟机apache启动
  3. 深入JVM内核--GC算法和种类
  4. [LC] 32. Longest Valid Parentheses
  5. WEB 安全 - xss 初探
  6. springboot项目基础面试题
  7. win7电脑磁盘文件以分组方式展现解决方案
  8. Uber自动驾驶卡车正式运营,是否会给卡车司机彻底“宣判死刑”?
  9. toString()和强制类型转换(String)的用法
  10. TCP大文件发送案例以及UDP介绍