linux静态库与动态库

  当我们进行c编程时,要实现多个功能时,可以采用两种模型

  1.单一模型:将所有功能都全部实现于一个文件。简言之就是把所有的代码都写在一个c文件中,初学时常常这么做,但是其编译时间过长,及其不利于维护与协作开发。代码过多时,一坨又一坨的代码看着就头疼。

 2.分离模型:进行模块化,将不同功能分别划分到不同源文件中,各个功能链接成不同的库文件。这样可以缩短编译时间,维护和协作开发容易。

  如果采用分离模型,则可以按照如下实例来解释:

   a.o  \

   b.o  |------>库  +  其他模块  +  ...  + main() =可执行文件

   c.o  /

  上图中提到了库,则其可以分为静态库和动态库。

  静态库:本质就是将多个目标文件打包成一个文件,而链接静态库(可以理解为使用静态库)就是将库中调用的代码复制到相应文件中。  

  由于调用过程全是直接复制的,所以使用静态库调用的代码通常需要较大的空间,而且库中代码一旦修改,使用该库的代码就应该重新链接。但是由于其直接复制的原因,运行的时候也不需要依赖库,而且执行效率很高。

  所以得出结论:静态库缺点:体积大,一旦更改要重新链接。优点:速度快,不需要依赖库,便于移植。

  静态库的使用后方法:

  1.静态库的形式:libxxx.a

                                   |

                                 此处xxx为希望的库名

  2.构建:由.c文件生成.o文件,后将多个.o链接为libxxx.a文件。

    首先要生成.o文件,可以直接通过gcc -c xxx.c 生成xxx.o文件。

    当有多个.o文件时,通过ar -r  libxxx.a  xxx.o  yyy.o来生成libxxx.a静态库。

  3.使用:如果环境变量已经设置好当前目录,则可以:gcc -o main main.c -lxxx

如果没设置好,则稍微麻烦些,应为:gcc -o main main.c -lxxx -L./          (这里的-L后的./为静态库的路径,本文的静态库就在当前文件件,即./)。

动态库:相比于静态库,动态库则不需要将代码复制到调用模块内,而是将所用的功能的相对地址嵌入到应用对象中,如果多个进程同时使用库中一个区域的代码,则动态库仅仅在内存空间中复制一份,因此动态库也常被称作共享库或者共享对象。

动态库的缺点和优点是显而易见的,其占用空间小,即使修改了一部分代码,只要接口保持不变(库某个功能的地址不变),则不需要重新链接。但是其运行时需要库的支持,即依赖库,而且执行效率略微低。

动态库的使用方法

1.动态库的形式:libxxx.so

                                  |___xxx为库的名字

2.构建:此时也要生成.o文件,但是方法与上述不同,其要求加入-fpic选项,从而形成位置无关码,即其指令格式为gcc -c -fpic xxx.c,从而生成xxx.o

当生成多个.o文件,则可以通过gcc -shared -o libXYZ.so xxx.o yyy.o生成名为XYZ的动态库文件。

3.使用:首先要注意相关的环境变量,当链接时,需要更改LIBRARY_PATH为库文件夹,运用指令为export LIBRARY_PATH=<相应路径>,如果为本文件夹,则可以为export LIBRARY_PATH=./

如果要使用含有库文件的可执行文件,则应该更改LD_LIBRARY_PATH的路径为库路径,即export LD_LIBRARY_PATH=./

当其设置完成后,则可以进行链接,指令为:gcc ... -lxxx  如本文其都在同一文件夹,则为gcc -o main main.c -lXYZ   后执行./main即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值