zoukankan      html  css  js  c++  java
  • 静态库与动态库的创建与使用

    1. 基本概念

    • 静态库:链接时,库与编译生成的 .o 文件一起打包到可执行文件中。 linux / windows 下扩展名分别为:.a / .lib
    • 动态库:链接时,不会打包到可执行文件中, 执行时会动态的加载动态库。 linux / windows 下扩展名分别为:.so / .dll

    区别主要体现在:

    1. 可维护性。
      • 合入更新。合入动态库的更新,只要替换库即可。但合入静态则需要重新链接,生成新的可执行程序,全量更新。
      • 环境依赖。若包含静态库,编译成功后不依赖环境。动态库则存在依赖关系,需要环境中存在对应的动态库。
    2. 大小
      • 空间利用率。若依赖相同静态库,则存在多份拷贝。
      • 可执行文件大小。静态库文件较大。
    3. 动态库可以实现进程之间的资源共享,因此也称为共享库。

    2. 静态库的创建与使用

    静态库本质就是一组 .o 组成的压缩文件,扩展名为 .a / .lib

    ar -crv libXXX.a mmmm.o nnnn.o

    XXX 是库名,mmmm.o nnnn.o 是要打包的目标文件。crv 参数,含义分别是

    • c: do not warn if the library had to be created
    • r: replace existing or insert new file(s) into the archive
    • v: be verbose

    使用时,只需在代码中引入 头文件,链接时,指定静态库的搜索路径(-L选项)和静态库名(不需要lib前缀和.a后缀,-l选项)。

    g++ test.cpp -L../StaticLibrary -lXXX

    3. 动态库

    WindowLinux执行文件格式不同,在创建动态库的时候有一些差异。

    • Windows 下执行文件是 PE 格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字
    • Linux下 gcc 编译的执行文件默认是 ELF 格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。

    linux 下动态库的命名格式同静态库,为 libXXX.so 格式。

    动态库的创建,使用编译器即可,不需要像静态库一样使用专门的打包工具。

    若要创建动态库,源码编译时添加 -fPIC 选项,链接时添加 -shared 选项

    g++ -fPIC -shared -o libXXX.so xxx.cpp

    用法同静态库,

    g++ test.cpp -L../DynamicLibrary -lXXX

    只是需要设置下搜索路径。默认搜索路径:/lib/, /usr/lib。

    设置搜索路径:

    1. 编辑 /etc/ld.so.conf,设置搜索路径
    2. 运行 ldconfig ,重建 /etc/ld.so.cache 文件。设置生效。

    4. 相关工具

    ldd 查看程序依赖的共享库(动态库)

    gcc / g++ 参数 -I(大写 'i'),-L(大写'l'),-l(小写'L')

    •  -I(大写 'i') 头文件目录
    • -L(大写'l') 库目录
    • -l(小写'L') 库名

     大写是目录,小写是库。

  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/misspy/p/3687786.html
Copyright © 2011-2022 走看看