Linux-静态库和动态库

库有两种,一种是静态链接库,一种是动态链接库,不管是哪一种库,要使用它们,都要在程序中包含相应的include头文件。我们先来回顾一下程序编译的过程。如下图:
这里写图片描述
库:本质一个目标文件,这个文件的后缀有两种格式,对应两种库

  • 静态库
    .a (linux环境下)
    .lib (Window环境下)

  • 动态库
    .so (linux环境下)
    .dll(windows环境下)

  • 静态库链接(.a):程序在链接的时候,将源文件中用到的库函数拷贝到内存与汇编生成的目标文件.o合并生成可执行文件。该可执行文件可能会比较大。

这种链接方式的好处是:方便程序移植,因为可执行程序与库函数再无关系,放在如何环境当中都可以执行。

缺点是:文件太大。多次拷贝库程序,不仅浪费空间,而且文件体积大

  • 动态库链接(.so):程序在运行时才去链接动态库代码,多个程序共同使用这个代码,
    只应用一个库,这个库在内存中只有一份,供所有程序使用。

优点:程序运行过程中动态调用库文件,很方便,又不占空间,
缺点:动态链接有一个缺点就是可移植性太差,如果两台电脑运行环境不同,动态库存放的位置不一样,很可能导致程序运行失败。

下面实现一个静态库文件()
add.h

#pragma once
int add(  int a,int b);

sub.h

#pragma once
int sub(  int a,int b);

add.c

#include "add.h"
int add(  int a,int b)
{

    return a+b;
}

sub.c

#include "sub.h"
int add(  int a,int b)
{

    return a-b;
}

main.c

#include <stdio.h>
#include "add.h"
#include "sub.h"
int main(  )
{
      int a=20;
      int b=10;

      printf(  "add(  a,b)=%d\n  ",a,b,add(  a,b));

      printf(  "sub(  a,b)=%d\n  ",a,b,sub(  a,b));
      return 0;

}

makefile文件

.PHONY:all
all:add.o sub.o

add.o:add.c
    gcc -c add.c -o add.o

sub.o:sub.c
    gcc -c sub.c -o sub.o

.PHONY:clean

clean:
    rm -f *.o

编写好上述代码后按照以下做法即可实现一个静态库

第一步:生成目标文件
这里写图片描述
执行make,生成目标文件。由于静态库是在编译链接的时候把库的代码链接到可执行文件中去,生成 *.o文件是便于链接。

第二步:生成静态库
这里静态库名前要以lib开头,以.a结束


[zyc@localhost lib]$ ar -rc libmymath.a add.o sub.o
  • ar: 是gnu的归档工具

  • -rc: replace and creat

第三步:查看静态库中的目录列表

[zyc@localhost lib]$ ar -tv libmymath.a


rw-rw-r-- 500/500   1240 Mar 30 00:49 2018 add.o
rw-rw-r-- 500/500   1240 Mar 30 00:49 2018 sub.o

  • t : 列出静态库信息
  • v 列出详细信息

第四步:测试目标文件
测试时去掉静态库名前缀lib和.a后缀

[zyc@localhost lib]$ gcc main.c -L. -lmymath
[zyc@localhost lib]$ ls
add.c  add.h  add.o  a.out  libmymath.a  main.c  makefile  sub.c  sub.h  sub.o
[zyc@localhost lib]$ ./a.out
add(  a,b)=20
sub(  a,b)=20

  • -L 指定库路径()
  • -l 指定库名

测试目标文件生成后,即使删除静态库,程序依然可以执行。

[zyc@localhost lib]$ rm libmymath.a
[zyc@localhost lib]$ ls
add.c  add.h  add.o  a.out  main.c  makefile  sub.c  sub.h  sub.o
[zyc@localhost lib]$ ./a.out
add(  a,b)=20
sub(  a,b)=20

以上就是自己打造的静态库。
下面来看动态库的打造
由于动态库暂时运行不出来,先不放动态库程序了,后续更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值