linux下的动态库和静态库及其使用

发表于:2021-7-22 09:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Beam_WA    来源:CSDN

  1.库的基本介绍
  无论是在windows还是linux下都存在着库,库是二进制文件,里面有一些函数,它可以看成函数的集合,可以方便程序员调用,程序员只需要include它的头文件即可调用函数。
  使用库的好处:
  ①可以减少开发者的代码开发量,缩短开发周期。
  ②提高代码的重用性。
  库如何进行使用:
  在前面说到了方便程序员调用,那么如何使用呢,就需要两个文件,一个是头文件,一个是库文件。
  ①头文件——包含了库函数的声明。
  ②库文件——包含了库函数代码的具体实现细节。
  注:库并不能单独使用,只有通过其他程序调用才能执行。
  在linux下可以分为动态库和静态库,下面对这两个库展开进行说明。
  2.静态库
  静态库可以认为是一些函数的集合,它是在程序运行前就加载到程序里面了,成为程序执行的一部分。
  静态库一般的格式为:lib + “名字” + .a 后缀为.a
  例如:libtest1.a
  下面进行静态库的制作:
  步骤一:
  将编写好的.c文件的代码生成对应的.o文件。
  gcc -o file1.c file2.c
  步骤二:
  将生成好的.o文件通过ar打包工具打包成.a文件。
  ar rcs libtest.a file1.o file2.o
  其中rcs参数的意思如下:
  ①r更新
  ②c创建
  ③s建立索引
  步骤二结束后就会出现libtest.a这么一个 库文件,那么我们需要用以下命令去使用它。
  之前说过,库不能单独使用,要配合头文件和其他程序使用,这里我用main.c来包含头文件,并且调用库里面的函数,main.c和其余的代码会在下面给出。
  gcc -o main1 main.c -I./ -L./ -ltest
  对上面的几个参数做一下解释:
  ①-I:是include也就是main.c指定头文件的目录,这里./就是说明当前位置。
  ②-L:指定要连接的库所在的目录。
  ③-l:这里l后面跟的名字一定要去掉lib和.a,这就是库文件名称。
  静态库的优缺点:
  ①优点:
  静态库是直接加载到应用程序里面的,所以方便程序进行寻找。
  程序在运行的时候和库函数没有任何关系了,因为库函数的已经加载到应用程序里面了,所以移植到其他地方就很方便,不用管库函数。
  ②缺点:
  消耗系统资源比较大,每个使用静态库的都要复制一份,浪费内存。下面从别的地方偷一张图来说明这点。
  还有一点就是更新不太方便,如果这个应用程序,比如一个游戏需要更新,那么我就需要重新下载一下,因为静态库的是直接加载到应用程序里面的,就需要重新编译。这样可能是一个很小的操作,都会导致重新下载或编译。
  3.动态库
  在linux里动态库也可以叫作共享库。动态库和静态库不一样,它只有在程序运行时才被载入的。并且几个程序都调用它的话,只要在内存中有一份就行,避免了静态库的浪费资源的问题。同时它也避免了静态库更新的问题,用户只需要更新动态库即可。
  动态库一般格式:lib + “名字” + .so
  例如:libtest.so
  下面通过一张图来了解下动态库(图来自网络)
  动态库的制作其实和静态库差不多,但是还是有点区别:
  步骤一:
  生成目标.o文件,这时候要加编译选项-fpic(pic,position independent code),目的是为了能够在多个应用程序间共享。
  gcc -fpic file1.c file2.c
  步骤二:
  生成共享库,此时要加链接器选项:-shared
  gcc -shared file1.o file2.o -o libtest.so
  共享库的使用:
  使用方法与静态库一样。
  gcc -o main main.c -I./ -L./ -ltest
  这里可能会出现一个错误,就是说找不到你的libtest.so文件。
  因为你的库的寻找的地方没有进行配置,这时你可以把你的libtest.so文件放到/usr/lib下,不过这里一般是放系统文件的,不太可取,那么就用另一个方法。
  在~目录下用:
  vi .bashrc
  然后在最后面加上
  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你指定的目录 
  你指定的目录例如:~/lib 这样
  动态库的优缺点:
  ①优点:
  其实优点就是静态库的缺点,它方便更新,也不会占用太多资源。
  ②缺点:
  缺点恰好是静态库的优点,他移植性差,因为你动态库不是加载到应用程序内部的,所以移植的时候得带上,并且加载是外部加载,所以会比较慢。
  4.文中提到的几个文件代码
  //main.c
    1 #include <stdio.h>
    2 #include <stdlib.h>
    3 #include "head.h"//fun1和fun2的函数声明的头文件
    4 
    5 int main(int argc,char *argv[])
    6 {
    7     printf("this is main!\n");
    8 
    9     file1();
   10     file2();
   11 
   12     return 0;
   13 }
   //file1.c
    1 #include <stdio.h>
    2 void file1()
    3 {
    4     printf("this is file1\n");
    5 }
   //file2.c
    1 #include <stdio.h>
    2 void file2()
    3 {
    4     printf("this is file2\n");
    5 }

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号