Linux中静态库和动态库的使用

发布时间:2024年01月23日

库的概念

  • 介绍:
    库是一个二进制文件,包含的代码可被程序调用
    标准C库、数学库、线程库…
    库有源码,可下载后编译;也可以直接安装二进制包
    位置一般放在:/lib /usr/lib
  • 库的知识
    库是事先编译好的,可以复用的代码
    在os上运行的程序基本上都要使用库,使用库可以提高开发效率
    window和Linux下库文件的格式不兼容
    Linux下包含静态库和动态库
  • 静态库的特点
    编译时把静态库中相关代码复制到可执行文件中
    程序中已包含代码,运行时不再需要静态库
    程序运行时无需加载库,运行速度更快
    占用更多磁盘和内存空间
    静态库升级后,程序需要重新编译链接
  • 案例如下:
    在这里插入图片描述
    注:此时生成hello.o文件,但不是可执行文件,没有链接库
  • 静态库创建
    静态库
    创建静态库步骤:
    1 . 编写库文件代码,编译为.o 目标文件。
    2. ar 命令 创建 libxxxx.a 文件
    ar -rsv libxxxx.a xxxx.o
    ar 参数如下:
    在这里插入图片描述
    注意:1 静态库名字要以lib开头,后缀名为.a
    2 没有main函数的.c 文件不能生成可执行文件。
    链接错误:
    test.c:(.text+0x15):对‘hello’未定义的引用
    collect2: error: ld returned 1 exit status
    含义:表示hello函数在编译的源码内没有找到实现
    解决:实现代码或者找到对应函数的库并且链接它。
    链接静态库:
    gcc -o 目标文件 源码.c -L路径 -lxxxx
    -L 表示库所在的路径
    -l 后面跟库的名称
  • 案例如下:
    在这里插入图片描述
    注:ar -t .a文件:可以得到是由哪个文件得到的
  • 如何使用上述的静态库
    在这里插入图片描述
    注:出现以下错误是由于没有链接库
    在这里插入图片描述
  • 链接库后得到如下(如果将test可执行文件转移到其他目录下,不依赖库文件,也可以执行):
    在这里插入图片描述
  • 动态库
    编译时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码
    程序不包含库中代码,尺寸小
    多个程序可共享同一个库
    程序运行时需要加载库
    库升级方便,无需重新编译程序
    使用更加广泛
  • 共享库创建
    动态库的生成步骤:
    1. 生成位置无关代码的目标文件
      gcc -c -fPIC xxx.c xxxx.c …
    2. 生成动态库
      gcc -shared -o libxxxx.so xxx.o xxx.o …
    3. 编译可执行文件
      gcc -o 目标文件 源码.c -L路径 -lxxxx
  • 代码如下:
    在这里插入图片描述
    注:执行动态库的可执行文件错误
    ./test: error while loading shared libraries: libmyheby.so: cannot open shared object file: No such file or directory
    含义:可执行文件所使用的动态库找不到
    解决办法:
    • 找到动态库,添加到/usr/lib里面
    • 或者使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的动态库目录,注意在这么加的路径后,只能在当前shell有效
    • 添加在~/.bashrc 文件里面,适用于所有shell,加入export LD_LIBRARY_PATH = LIB_PATH
    • 在/etc/ld.so.conf.d/下加入路径
  • 如何找到一个文件的动态库的名称,如下:
    在这里插入图片描述
文章来源:https://blog.csdn.net/weixin_58036810/article/details/135779555
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。