• 动态库和静态库的制作


    一.库的制作

    1.1什么是库文件?

    库是一个二进制文件,是将xx.c(main)文件编译生成的二进制文件,库分为动态库和静态

    window:

    静态库 xxx.lib

    ​ 动态库 xxx.dll

    linux:

    ​ 静态库 libxxx.a

    ​ 动态库 libxxx.so

    二.静态库

    2.1静态库概念

    静态库是lib库名.a格式的文件,如果在编译的时候需要使用静态库,会将静态库中的函数编译到可执行程序中,

    可执行程序的体积比较大,效率会比较高。静态库更新后,需要重新编译可执行程序,否则可执行程序中拿不到最新的库中的函数(更新麻烦)。

    2.2静态库的制作

    gcc -c add.c -o add.o //只编译不连

    ar -cr libadd.a add.o //ar制作静态库的命令, -c 创建静态库 -r把函数放到库中

    2.2.1静态库如何使用

    1. -l :链接库 (link)
    2. -L :指定库的路径 (Library)
    3. -I :指定头文件的路径 (include)

    2.2.2静态库实例代码

    add.h

    1. #ifndef __ADD_H__
    2. #define __ADD_H__
    3. int add(int ,int);
    4. #endif

    add.c ====>libadd.a

    1. int add(int a,int b)
    2. {
    3.     return (a+b);
    4. }

    main.c

    1. #include 
    2. #include 
    3. int main(int argc,const char * argv[])
    4. {
    5.     int sum;
    6.     sum = add(100,200);
    7.     printf("sum = %d\n",sum);
    8.     return 0;
    9. }

    三.动态库

    3.1什么是动态库

    动态库在使用的时候只是将库中的函数的符号表放到了可执行程序中,所以可执行程序的体积比较小,在可执行程序运行的时候还需要依赖动态库文件。所以动态库的效率比较低,但是动态库更新方便。所以动态库在系统中用的地方非常的多。动态库又叫共享库

    3.2动态库的制作

    gcc -c -fPIC add.c -o add.o //将add.c只编译不链接生成add.o -fPIC忽略文件位置

    gcc -shared add.o -o libadd.so //将add.o编译生成共享库

    gcc -fPIC -shared add.c -o libadd.so //直接将add.c编译生成libadd.so库文件

    3.3动态库的使用

    1. -l :链接库 (link)
    2. -L :指定库的路径 (Library)
    3. -I :指定头文件的路径 (include)

    3.4基于动态库可执行程序执行的过程

    3.4.1方式1:

    1. export LD_LIBRARY_PATH=../lib/
    2. // 指定库的路径,只对当前终端生效

    3.4.2方式2:

    ​ 将自己的编译好的libadd.so库放到系统的库的路径下即可。

    ​ 

    3.4.3方式3:

    修改系统的库的配置文件

    sudo vi /etc/ld.so.conf.d/libc.conf 
    

    ​ 

    ​ 执行sudo ldconfig让配置文件生效

    4.3.5动态库的实例

    add.h

    1. #ifndef __ADD_H__
    2. #define __ADD_H__
    3. int add(int ,int);
    4. #endif

    add.c ====>libadd.so

    1. int add(int a,int b)
    2. {
    3.     return (a+b);
    4. }

    main.c

    1. #include 
    2. #include 
    3. int main(int argc,const char * argv[])
    4. {
    5.     int sum;
    6.     sum = add(100,200);
    7.     printf("sum = %d\n",sum);
    8.     return 0;
    9. }
  • 相关阅读:
    【QT】QtCreator卸载与安装(非正常状态)
    YOLOX 学习笔记
    算法与设计分析 | 全排列问题
    回归预测 | MATLAB实现IWOA-LSTM改进鲸鱼算法算法优化长短期记忆神经网络的数据回归预测(多指标,多图)
    记录一个sentinel修改密码方法
    java 实现外观模式
    Oracle创建索引
    【微信h5】获取用户openid:基于vue3+springBoot
    规则引擎(JVS-rules):从应用到场景的全面解析
    SimpleDateFormat 多线程存在的问题及解决方案
  • 原文地址:https://blog.csdn.net/a2998658795/article/details/126733027