首页 > 其他分享 >静态库与动态库(区别,优缺点,创建与使用)

静态库与动态库(区别,优缺点,创建与使用)

时间:2023-02-22 20:11:26浏览次数:49  
标签:gcc lib 静态 创建 xxx 优缺点 usr 动态

1.库是什么?

  库是写好的,现有的,成熟的,可以复用的代码。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。即为源代码的二进制文件

2.库的类型

  1)在Windows中,.dll后缀为动态库,.lib后缀为静态库。

  2)在Linux中,.so后缀为动态库,.a则为静态库

3.动态库与静态库的优缺点

  1)静态库:

    在程序执行前(编译)就加入到目标程序中

    优点:

    ①静态库被打包到应用程序中,加载,运行速度快

    ②发布程序无需提供静态库,因为已经在app中,移植方便

    缺点:

    ①大,相同的库文件可能在内存中被加载多份,消耗系统资源,浪费内存

    ②库文件更新需要重新编译项目文件,生成可执行程序,浪费时间

  2)动态库:

    在程序执行时动态(临时)由目标程序去调用

    优点:

    ①程序更轻量,

    ②可实现不同进程间的资源共享

    ③动态库升级简单,只需要替换库文件,无需重新编译应用程序

    ④可以控制何时加载动态库,不调用库函数动态库不会被加载

    缺点:

    ①程序运行,加载速度相比用静态库慢

    ②发布程序需要提供依赖的动态库

4.静态库的制作与使用

  1)静态库制作:

    ① gcc  xxxxxx.c  -c 生成 xxxxxx.o文件

    ②ar rcs libxxxxxx.a xxxxxx.o   由xxxxxx.o文件生成libxxxxxx.a静态库

  2) 静态库使用:

    ① gcc  主程序.c  -lxxxxxx -L ./   -o  xxxx  编译程序后,库就加载到程序中了。在执行此xxx程序的时候,不需要接库(可对比下面调用了动态库的程序运行方式)

      -lxxxxxx  -l是指定要用的静态库,库名砍头去尾,  -L是告诉gcc 编译器从-L指定的路径去找静态库。默认是从/usr/lib  /usr/local/lib  去找

      -o xxx 将编译出来的程序命名为xxx

5.动态库的制作与使用

  1)动态库制作:

    ① gcc -shared -fpic xxxxxx.c -o libxxxx.so   直接用此指令以xxxxxx.c 生成llibxxx.so的动态库

      -shared 指定生成动态库  -fpic 此选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码

   2)动态库使用:

    ①(编译) gcc 主程序.c -lxxxx -L ./ -o  xxx  -l是指定要用的动态库,库名砍头去尾,  -L是告诉gcc 编译器从-L指定的路径去找静态库。默认是从/usr/lib  /usr/local/lib 去找

    ②(运行)直接./xxx运行发现报错,解决方式:

                ⑴ sudo cp libxxxx.so /usr/lib/  将库复制到/usr/lib/再运行即可,因为程序默认回到此文件夹下找库

        ⑵ export  LD_LIBRARY_PATH="动态库所在的文件夹的绝对路径"  再运行程序  设置环境变量 (常用)但此环境变量是临时的换个ssh的窗口就不行了。所以往往会写一个shell脚本

        脚本内容为这句话,加主程序。

      例如xxx.sh:

 export  LD_LIBRARY_PATH="/home/pi/back/test"
./xxxx

 

标签:gcc,lib,静态,创建,xxx,优缺点,usr,动态
From: https://www.cnblogs.com/hetaoBlog/p/17145703.html

相关文章