动态库&静态库

文章介绍了静态库(如.a,.lib)和动态库(如.so,.dll)的差异。静态库在编译时被整合到可执行文件中,使程序体积大但独立性强;动态库在运行时加载,减小程序体积但依赖系统环境。创建静态库使用`ar`命令,动态库则需`g++`的`-fPIC`和`-shared`选项。`ldd`用于查看程序运行时依赖的动态链接库。
摘要由CSDN通过智能技术生成

静态库&动态库

  • 可执行文件 & 目标文件 存储格式相同,只是差一步链接,可看做一类文件(Windows下的PE[portable_executable]文件 Linux下的ELF[executable_linkable_file]文件)

    • 可执行目标文件:可以独立运行的程序
    • 可重定位目标文件:包含了二进制代码和数据,可以与其他可重定位目标文件合并为一个可执行目标文件(例如静态库)
    • 共享目标文件:在运行时链接的文件(例如动态库)
    • 核心转储文件:当进程意外终止时,系统用来储存该进程地址空间的内容以及终止时的一些其他信息
  • 库:可直接使用的功能函数总集

  • 静态库[.a(archive).lib(library)]:和源文件一起编译成整个可执行程序的函数库

    • 程序体积更大,但独立性更强、程序性能更好(加载速度快)
  • 动态库[.so(shared_object).dll(dynamic_link_library)]:程序运行时再去特定位置调用的函数库(函数调用与实现的解耦)(进程间的资源共享)

    • 程序体积小,但对系统环境依赖性强,同时便于函数库更新和兼容
    • 查看可执行程序运行时使用的系统动态链接库:ldd [filename]
  • 编写库

    • 静态库:[libxxx.a]
      • g++ -c[only_build_not_link] StaticMath.cpp [build_code]
        ar[archive] -r[replace覆盖]c[create新建] libstaticmath.a StaticMath.o [create_lib_using_object_file]
        • ar -t[table]v[verbose] libstaticmath.a 列出静态库中的文件
      • 注:静态/动态库 = 头文件[include]+lib函数实现[mathlib]
    • 动态库:[libxxx.so]
      • g++ -fPIC[position_independent_code地址无关,便于共享] -c DynamicMath.cpp [有-fPIC则程序使用相对地址,各调用者可以共享动态库,无-fPIC则使用绝对地址,每个调用者保有一份地址重定位后的库文件副本]
        g++ -shared -o[指定生成文件] libdynmath.so DynamicMath.o
      • 合二为一:g++ -fPIC -shared -o libdynmath.so DynamicMath.cpp
      • 注:系统需要调用动态库时依赖 动态库载入器 定位库的绝对位置,因此动态库要么
          1. 在/lib or /usr/lib中:sudo cp mlib/lib/libcal.so /lib64
          1. /etc/ld.so.cache 列表下 [加入列表:编辑/etc/ld.so.conf,加入库文件所在目录的路径,运行ldconfig,重建/etc/ld.so.cache文件],
          1. 修改环境变量export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/cl/BasicIO/testlib/project/mlib/lib
  • 调用库编译

    • 静态库:gcc -static -o main main.o -lxxx (call libxxx.a)
      • or g++ TestStaticLibrary.cpp -I ./include[.h_file_path] -L…/StaticLibrary[lib_path] -lstaticmath[lib]
      • 注:当链接器从左向右扫描到main.o过程中,会先记录下undefined的标识符,再在libxxx.a中查找,因此 -lxxx 必须在后面
    • 动态库:gcc -o main main.o -lxxx (call libxxx.so)【默认动态】
      • g++ TestDynamicLibrary.cpp -L …/DynamicLibrary -ldynmath
      • -I -L -l和后续参数间空格可有可无,注意:这三个参数用于编译时使用,程序运行时参数不起作用
      • sudo cp mathlib/include/* /usr/include/
        sudo cp mathlib/lib/libcal.a /lib64/ 将头文件和库文件拷贝到系统默认路径后,可以不用指定 -L 和 -I
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值