zoukankan      html  css  js  c++  java
  • 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
    总用量 16
    -rw-r--r--. 1 root root   63 4月  20 14:53 add.c
    -rw-r--r--. 1 root root 1240 4月  20 15:20 add.o
    -rw-r--r--. 1 root root   63 4月  20 14:24 sub.c
    -rw-r--r--. 1 root root 1240 4月  20 15:20 sub.o
    • 将.o文件打包生成动态库
    [root@centos1 src]# gcc -shared -o libCalc.so *.o
    [root@centos1 src]# ll
    总用量 24
    -rw-r--r--. 1 root root   63 4月  20 14:53 add.c
    -rw-r--r--. 1 root root 1240 4月  20 15:20 add.o
    -rwxr-xr-x. 1 root root 5817 4月  20 15:21 libCalc.so
    -rw-r--r--. 1 root root   63 4月  20 14:24 sub.c
    -rw-r--r--. 1 root root 1240 4月  20 15:20 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
    总用量 24
    drwxr-xr-x. 2 root root 4096 4月  20 15:07 include
    drwxr-xr-x. 2 root root 4096 4月  20 15:29 lib
    -rwxr-xr-x. 1 root root 7066 4月  20 15:30 main
    -rw-r--r--. 1 root root  179 4月  20 14:57 main.c
    drwxr-xr-x. 2 root root 4096 4月  20 15:29 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
    10 + 10 is 20
    10 - 10 is 0

    (3)配置/etc/ld.so.conf文件,增加 /home/xuejiale/src/calc/lib/ 路径,执行 ldconfig -v,并执行main

    /home/xuejiale/src/calc/lib/
    [root@centos1 calc]# ./main
    10 + 10 is 20
    10 - 10 is 0

    3. 优缺点总结

       缺点:

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

       优点:

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

    动静态库总结:

         静态库特点:

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

        动态库特点:

    • 库的代码不会编译进程序里面,所以动态库编译的程序比较小。
    • 由动态库编译的程序依赖于系统的环境变量有没有这个库文件,没有则运行不了。
  • 相关阅读:
    AI换脸必备知识:如何查看显卡型号以及显存大小!
    DeepFaceLab620稳定版使用过程详解!
    DeepFaceLab错误:DLL Load failed 找不到指定模块!
    DeepFaceLab进阶:H128,DF,SAE模型有何不同?哪个最好?
    J2EE与EJB
    Servlet与JSP
    Java网络编程详解
    Java多线程详解
    Java数据库操作
    Java多线程
  • 原文地址:https://www.cnblogs.com/YuchuanHuaying/p/11129242.html
Copyright © 2011-2022 走看看