Linux编程(5)_静态库与动态库

1 库是什么

假如你写了一个perfect的项目, 有公司想要购买的你的源代码, 此时你肯定不想把你的源代码就这么给别人, 你只想让别人使用就够了.

那么你可以把的源代码生成为.o二进制文件, 封装成库, 这样别人既可以使用, 你的源代码也不会泄露. 而且c的二进制文件很难反编译, java则比较容易…

  • 二进制文件
  • 将源代码 ->> 二进制格式的源代码
  • 加密

库的使用需要头文件与库文件

2 静态库.a的制作和使用

2.1 命名规则 :

由三部分组成 : libxxx.a xxx 为库的名字

2.2 制作步骤

  1. 源代码( c, cpp)
  2. 生成二进制文件(.o) gcc hello.c -c
  3. 将.o打包, 用到工具ar, archive(归档), ar rcs 静态库的名字 原文件 , 例 : ar rcs libtest.a hello.o
  4. nm libtest.a 查看静态库里的内容

2.3 库的使用

  • gcc main.c -I ./ -L./lib -lmycalc-o app
  • -L : 指定库的路径
  • -l : 指定库的名字(掐头去尾)
  • -I : 指定头文件的路径
  • -o : 指引生成文件的名字

3 动态库.so的制作和使用

3.1 命名规则

libxxx.so : xxx库的名称

3.2 制作步骤

  1. 将源文件生成二进制文件.o

    gcc a.c b.c -c -fpic(fPIC)

  2. 打包

    gcc -shared a.o b.o -o libxxx.so

3.3 库的使用

  1. 需头文件a.h

  2. 需动态库 libtest.so

  3. gcc main.c -I ./include -L ./lib -l test -o app

    -I : 指定头文件的路径

    -L : 指定库的路径

    -l : 指定库的名字(掐头去尾)

    -o : 指引生成文件的名字

    • ldd app查看可执行程序运行时需要哪些库

3.4 动态库加载

1 使用环境变量 env中PATH
  • 临时设置 :
    • 在终端中 export LD_LIBRARY_PATH=动态库路径:$LD_LIBRARY_PATH
    • $是取值符, 冒号拼接, 以免覆盖里面本来就有的值
  • 永久设置 :

    用户级别

    • 写入语句 ~/.bashrc
    • 然后重启中终端 或 source ~/.bashrc

    系统级别

    • /etc/profile
    • 重启系统 或 source /etc/profile
2 更新/etc/la.socache文件列表

适用于长期不变

  • 找到配置文件/etc/ld.so.conf
  • 把动态库的绝对路径写入
  • 执行命令 sudo ldconfig [-v](显示信息)
3 调用函数

dlopen, dlclose, dlsym

4 静态库, 动态库优缺点

4.1 静态库

1 优点
  • 静态库被打包到应用程序中加载速度快
  • 发布程序无需提供静态库, 移植方便
2 缺点
  • 浪费系统资源, 浪费内存, 不同应用程序存在大量重复的库, 一位各自绑定在一起, 严重浪费内存
  • 更新, 部署 , 发布麻烦, 更新的话需要用户重新安装程序

4.2 动态库的优缺点

app制作好了之后, 动态库没有打包到app里, 动态库不会在开始被加载, 只当程序调用动态库中的函数时才会被加载. 程序运行之前会先判断库是否存在. 通过动态链接器ld-linux-x86-64.so

1 优点
  • 可实现进程间的资源共享
  • 程序升级简单
  • 可控制何时加载动态库
2 缺点
  • 加载速度比静态库慢
  • 发布程序需要提供相应动态库
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值