linux下的静态库和动态库

   linux下的库有两种:静态库和动态库(共享库),那仫他们的区别是什仫呢?

  静态库和动态库的区别?

   1.静态库:这类库的名字一般是"libxxx.a",利用静态库编译生成的文件比较大,因为在编译链接的时候所有使用到的函数库都会被加载到目标文件中。这种处理方式的优点是编译后的执行程序不需要外部函数库的支持,同样的这种处理方式既是它的优点,同时也是它的缺点,那就是如果静态函数库改变了此时的程序就必须重新进行编译链接。

   2.动态库:这类库的名字一般是"libxxx.so",相对静态函库来说动态库的体积相对较小,是因为动态函数库在编译的时候并没有加载到目标文件中。由于动态函数库没有整合到你的程序中,是在程序运行时动态的申请和调用,所以程序的运行环境中必须存在相应的库。因为动态函数库并不影响你的程序,所以它的升级相对简单。

   例如通过find / -name libpthread.so命令查看动态pthread库在/usr/lib/libpthread.so路径下.

  如何生成静态库和动态库?

   要明白linux下是如何生成静态库和动态库的,首先需要了解gcc的常见命令:

   1).无选项编译链接。eg:gcc test.c   //会默认生成a.out可执行程序
   2).-E:进行预处理和编译,生成汇编文件 eg:gcc -E test.c    //会生成test.i文件
   3).-S:进行预处理,编译,汇编等步骤 eg:gcc -S test.c      //生成test.s文件
   4).-c:直接生成二进制目标文件,eg:gcc -c test.c           //生成test.o文件

   5).-o:对生成的目标进行重命名,eg:gcc -o test test.c 或者是 gcc test.c -o test  //生成test的可执行文件,这个可执行文件紧挨着参数'-o'

   6).-g:在编译的时候用于debug调试信息,用于gdb调试
   7).-share:此选项尽量的使用动态库,所以生成文件比较小,但是必须是系统存在动态库。
   8).-shared:生成共享目标文件,通常用在建立共享库。
   9).-static:链接时使用静态链接,但是要保证系统中有静态库。

   10).-llibrary:定制编译的时候使用的库 ,eg:gcc -lpthread test.c //在编译的时候要依赖pthread这个库
   11).-Ldir:定制编译的时候搜索库的路径。如果是自己编写的库,可以用它来定制搜索目录,否则编译器只在标准库目录里面找,dir就是目录的名字。

   12).-C:在预处理的时候不删除注释信息,一般和-E使用。

   13).-pipe:使用管道代替编译中的临时文件,eg:gcc -pipe -o test test.c
   14).-include file:包含某个代码,相当于在文件中加入#include,eg:gcc test -include /root/file.h
   15).-Idir:当你使用#include”file”的时候,会先到你定制的目录里面查找
   16).-I-:取消前一个参数的功能。一般在-Idir之后使用

  1.生成静态库

    静态库的操作工具 gcc和ar命令,它的产生分两步:

    1).由源文件编译生成一堆".o"文件,每个.o文件中都包含这个编译单元的符号表

    2).ar命令将很多.o文件生成.a文件,生成静态库,eg:ar cr xxx.a xxx.o将创建静态库

  2.生成动态库

    无论是静态库和动态库都是由一大堆.o文件生成的,在上述gcc命令的简介中我们知道利用-shared可以创建动态库。eg;gcc -shared -fPCI -o xxx.so xxx.o.

    "PCI"命令行标记告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该消息代码的应用程序会将它连接到哪一段内存地址空间。这样编译出的xxx.o可以被用于建立共享链接库。

 如何查看一个可执行程序依赖于哪些库?

    ldd+文件名,可以查看一个可执行程序依赖的共享库

    

   可以看到mythread这个可执行程序依赖于动态库libpthread.so.

   OVER~~~~

    

     

Linux下,静态库动态库是两种不同的库文件形式。 静态库是将整个库编译进可执行程序中的库文件。这意味着使用静态库的可执行程序会比较大,但执行速度更快。静态库的资源都在可执行程序的内部,因此可以提供更快的执行速度。如果对空间不是特别敏感,而需要快速执行的情况下,可以选择静态库动态库是以libxxx.so命名的库文件。与静态库不同,如果程序使用动态库,库的数据不会在编译时编译进程序,而是在程序运行到与动态库相关的函数时,根据动态库留下的标记,在动态库中寻找资源。动态库的使用可以节省空间,但可能会牺牲一些执行速度。 根据具体的需求,选择使用静态库还是动态库需要进行详细分析。如果库文件较大,而且不需要很快的执行速度,可以选择动态库。对于对速度要求较高的程序,比如开机启动程序等,更推荐使用静态库。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [linux静态库动态库问题](https://download.csdn.net/download/u014132659/9673886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux系统下的静态库动态库](https://blog.csdn.net/weixin_46435653/article/details/120818065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值