• 静态库、动态库文件制作


    基本概念

    • 静态库 
      • 在编译程序的时候把这个库的内容加载到程序中。
      • 优点: 程序以后就不需要依赖库、执行效率有所提高
      • 缺点: 浪费一定的程序空间,无法对用户进行升级迭代
    • 动态库 
      • 编译时程序只是确认一下库中的接口是否合适匹配,并没有拷贝任何的代码,所以程序较小。
      • 优点: 节省一定的存储空间,后期对项目的升级迭代留下接口
      • 缺点: 程序运行时依赖于库文件、执行效率有所降低
    • 库文件的命名
      • 必须以lib开头作为前缀 比如 : libz.so  liba.so  libk.so.1.0.9.12
      • 静态库一般以 .a 作为后缀 , 动态库一般以.so 作为后缀
      • 库的名称是去除前缀和后缀 取中间的单词

    如何制作库文件

       无论是静态库还是动态库都需要.o作为原材料。

    静态库制作:

    1. 获得对应功能的.o文件
    $ gcc show_ui.c -o show_ui.o -c -fPIC -I../INC // -fPIC 告诉编译器生成一个跟地址无关的二进制文件
    $ gcc oper.c -o oper.o -c -fPIC -I../INC 
    $ gcc get_input.c -o get_input.o -c -fPIC -I../INC
    2. 把刚才获得的3个.o文件柔和成一个库文件
    $ ar rcs libmaster.a *.o
    3. 程序编译
    gcc main.c -o ../BIN/main -I../INC -L./ -lmaster gcc 
    -I../INC // 指定头文件路径 -L./ // 指定库文件路径 -lmaster // 需要链接的库名

    动态库制作:

    1. 跟静态库一样先准备好.o文件
    2. 制作动态库
    $ gcc -shared -fPIC -o libmaster.so *.o // 使用所有的.o文件来统一生成一个动态链接库libmaster.so  //-shared 生成共享库
    3. 运行程序
    $ ./main1 ./main1: error while loading shared libraries: libmaster.so: cannot open shared object file: No such file or directory
    错误原因:因为还没有告诉程序动态库文件在哪里,所以报错
     
    解决方法:
    方法1 : [ 推荐使用 ]
    把库文件存放到指定的路径中
    /lib 或/usr/lib
    sudo cp libmaster.so /lib //把 库拷贝到 库所存放的路径
    方法2 :
    设置环境变量
    1. 使用vim打开
    $ vim ~/.bashrc
    2. 在文件末尾添加
    export LD_LIBRARY_PATH=/home/gec/mylib:$LD_LIBRARY_PATH
    3. 从新生效配置脚本
    $ source ~/.bashrc
    实验发现gcc 默认会选择使用动态库 , 也可手动要求使用静态编译程序
  • 相关阅读:
    javascript:Storage 接口
    javascript:CORS 通信
    javascript:同源限制
    javascript:XMLHttpRequest 对象
    javascript:Cookie
    javascript:Navigator 对象,Screen 对象
    javascript:window 对象
    javascript:浏览器环境概述
    javascript:GlobalEventHandlers 接口
    javascript:其他常见事件
  • 原文地址:https://www.cnblogs.com/ding-ding-light/p/14087753.html
Copyright © 2020-2023  润新知