【Linux】动静态库

一.静态库

1. 创建静态库

a.分步制作静态库

静态库制作:原文件–>.o文件–>.a文件

  • 先将原文件.c 通过汇编命令生成gcc -c xx.c -o xx.o
  • 将许多个.o文件通过ar命令ar -rc libxx.a xx1.o xx2.o打包成为libxx.a的静态库
  1. 编写代码
    在这里插入图片描述

  2. 将原文件通过汇编命令生成目标文件
    在这里插入图片描述

  3. 将.o可重定向目标文件打包成为静态库
    在这里插入图片描述

ar:archive

静态库文件的格式:需要以lib开头,后缀为.a。形如libxx.a


b.使用makefile

使用makefile,生成并整理(发布,make test)头文件和库文件
在这里插入图片描述

2. 使用静态库

  • 编写一个带main函数的.c文件演示使用静态库
    在这里插入图片描述
a. 安装自己的库

拷贝库到系统默认路径下的操作,叫做库的安装

  • 对于系统或者语言的库,会放在系统的默认路径下

对于头文件gcc的默认搜索路径是:/usr/include

对于库文件的默认搜索路径是:/lib64 or /usr/lib64

  1. 拷贝到系统路径下
    在这里插入图片描述

  • gcc,默认使用的是c语言的静态库libc.a
    在这里插入图片描述

即使我们将我们自己写的libmy.a放到系统路径下了,仍然属于第三方库,需要手动选择链接

  1. 使用选项:-l+库名,使用自己的静态库
    在这里插入图片描述

  1. 卸载库,从系统路径下删除
    在这里插入图片描述

b. 使用gcc的选项
  1. -I:除了系统和当前路径,增加一个指定路径进行搜索头文件
    在这里插入图片描述

  2. -L:在指定路径下找库
    在这里插入图片描述


在这里插入图片描述

二.动态库

1. 创建动态库

a.分步制作动态库
  1. 编写代码
    在这里插入图片描述

  2. 汇编生成目标文件
    在这里插入图片描述

动态库是运行时使用,所有编译的目标文件是相对的地址编码,使用-fPIC

  1. 生成动态库
    在这里插入图片描述

动态库也需要以lib开头,后缀为.so。形如:libxx.so


b. makefile

使用makefile,生成并整理(发布)头文件和库文件
在这里插入图片描述

为将动、静态库区分,动态库的.o文件名有一个_d


2. 使用动态库

  • 编写一个带main函数的.c文件演示使用静态库
    在这里插入图片描述

  • 编译
    在这里插入图片描述

  • 运行
    在这里插入图片描述


可以发现在上文中对应静态库的编译也是:gcc main.c -I output/include -L output/lib -lmy的形式。

此时output/lib中有两个库文件,一个静态库libmy.a、一个动态库libmy.so

由上图运行结构可以发现-lmy链接的是动态库

  • 动静态库使用规则是:
  • 如果路径下只有静态库,gcc则只能针对该库进行静态链接
  • 如果动静态库都有,默认使用的是动态库
  • 如果指明-static则只使用静态库

在这里插入图片描述


由于报错是not found是由于./a.out运行时无法找到动态库

a. 添加路径到环境变量中

有一个环境变量LD_LIBARAY_PATH,存放着程序运行时,加载(load)的库(library)的路径(path)。

我们可以添加自己动态库的绝对路径到当前运行环境中的LD_LIBARAY_PATH
在这里插入图片描述

在当前运行环境下,使用export添加的环境变量,当退出重进后会清除的。因此需要每次登陆后需要运行时,再手动export添加一次


b. 添加路径到配置文件中

和上述的环境变量差不多,只不过每次重写登陆后,放在配置文件中的动态库的绝对路径还在,每次都能使用该动态库
在这里插入图片描述


c. 将动态库的软连接放在系统路径下

该方法貌似是最简单的

在这里插入图片描述

🦀🦀观看~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值