• 【Linux】静态库与共享库


    文章目录

    一、库

    库:

    • 是一组预先编译好的方法的集合
    • linux系统库存储的位置一般在/lib /usr/lib,在64位系统上有些库也可能被存储在/usr/lib.64下
    • 库文件一般被存储在/usr/include下或其目录下。

    库的分类:

    • 静态库(命名规则:libxxx.a)
    • 共享库/动态库(命名规则:libxxx.so)

    二、动态库与静态库

    • 静态库是指编译链接时,将库文件的代码全部加入到可执行文件中,这样运行时就不需要库文件了,但此时生成的可执行文件比较大。静态库的后缀名一般为“.a”。
    • 动态库(共享库)是指在编译链接时并不将库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库文件,这样可以节省系统的开销。动态库的后缀名一般为“.so”。
    • 在源程序中包含头文件时,如果所包含的头文件位于系统默认包含路径之内,只需给出头文件的名字即可,不需指定路径;如果所包含的头文件位于系统默认包含路径之外,则需要在编译时使用-I选项来指定头文件的路径。例如:
    •                      gcc example.c -o example -I/home/xxx/include
    • 头文件所对应的库文件,如果没有特别指定时,gcc会到默认的搜索路径下进行查找。如果库文件不在上述目录中,在编译时就需要使用-L选项来指定库文件的路径。例如:
    •                      gcc example.c -o example –L/home/xxx/lib
    • 说明:Linux系统中头文件的默认包含路径可以通过环境变量C_INCLUDE_PATH来设定,库文件的默认搜索路径可以通过环境变量LIBRARY_PATH来设定,程序运行时加载动态库的查找路径可以通过环境变量LD_LIBRARY_PATH来设定。

    静态库使用方法

    1.生成静态库

    1. 先将所有要生成库文件的.c文件编译为.o文件
    2. 创建静态库,使用ar命令
      1.  ar crv libxx.a xxx.o xxx.o  
      2.  其中,ar:生成静态库,c:创建库,r:将方法添加到库中,v:显示过程

    2.静态库使用库

    • 命令:
    • gcc -o main main.c -L. -lxxx
      • -L:指明使用库
      • -l:指定库名的名称(不需要lib和扩展名.a)

    3.对静态库举例

    • 以该main文件为例,内部调用了add(相加函数)和max(求最大值)函数,输出求解结果:

    • 如果在编译时,不加add.c和max.c就会报错,如下:

    •  在该情况下,只有将add.c和max.c加上,才能如下图正常编译出来:

    • 此时将max和add函数设为静态库foo使用,解决该问题(不调用add.c和max.c而正常运行)

     图示为创建foo.h头文件以及在main函数加入foo.h头文件

    • 做法:
    • 1.生成静态库
      • 先将所有要生成库文件的.c文件编译为.o文件
      • 创建静态库,使用ar命令(ar crv libxx.a xxx.o xxx.o) 
    • 2.使用库(gcc -o main main.c -L. -lxxx)

     根据上述步骤就可看出编译成功啦~

    共享库    

    1.引入共享库

    • 静态库缺点:当你同时运行许多应用程序,并且它们都使用来自同一个函数库的函数时,内存中就会有同一函数的多个副本。而且在程序文件自身中也有多份同样的副本,这将消耗大量宝贵的内存和磁盘空间,因此引入共享库。
    • 共享库:需要时才调用

    2.共享库的生成

    1. 先将所有要生成库文件的.c文件编译为.o文件
    2. 打包生成共享库

                    gcc -shared -fPIC -o libxxx.so xxx.o xxx.o

    3.共享库的使用

            gcc -o main main.c -L. -l库名

    4.注意:共享库需要放在标准路径下

            sudo mv libxxx.so  /user/lib

            补充:查看使用了哪些共享库

                    ldd main

    5.对共享库举例 

    • 生成静态库
      • 先将所有要生成库文件的.c文件编译为.o文件
      • 打包生成共享库(gcc -shared -fPID -o libxxx.so xxx.o xxx.o)
    • 使用库(gcc -o main main.c -L. -lxxx)
    •  上面的运行报错了因为没有将共享库移到标准库内,而系统查找时一般在标准库内,也就是lib位置,没找到,因此会报错,下面移动位置:

     根据上述步骤就可看出编译成功啦~

    共享库和静态库区别

    •         静态库:方法包含到库里面,体积大;
    •         共享库:方法没有包含进去,只是做了一个标记,体积小;共享库如果10个应用程序共享,那么磁盘上只有一份共享的库文件,而且运行加载时在内存中只加载了标记了的这一份库文件;而静态库,就是这10个应用程序都包含了这个库文件,那么10份的库文件都放在磁盘上了(占用磁盘空间),而且运行加载的时候占用内存空间(10份库文件都要加载);共享库便于升级。
  • 相关阅读:
    论文介绍《CrowdFormer: An Overlap Patching Vision Transformer for Top-Down Crowd Counting 》
    windows 下 QT Android 环境搭建(QGC 4.2.x + Qt 5.15.2)
    Springboot毕设项目公职备考在线学习平台e1h19(java+VUE+Mybatis+Maven+Mysql)
    听我一句劝好吗?放下那些老掉牙的性能优化笔记吧!又不是没有新的,跟不上时代的学了也没法直接用呀!
    Google Earth Engine APP——15行代码搞定一个inspector高程监测APP
    form 表单恢复初始数据
    零基础CMake入门(基于ROS)
    理想汽车×OceanBase:当造车新势力遇上数据库新势力
    【微信小程序】页面事件
    vivo 商品中台的可视化微前端实践
  • 原文地址:https://blog.csdn.net/qq_53830608/article/details/126771368