【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份库文件都要加载);共享库便于升级。
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值