树莓派——Linux共享库、静态库、动态库详解


库是什么?

  • 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。

如何使用?

  • 用户需要同时具有头文件和库。

linux库——分文件编程

关于头文件的引入:

  • <>会在usr/include或usr/local/include下找

  • ""会在当前路径下找

分文件编程主要是将功能性函数分开

功能性函数:

  • 串口
  • 网络
  • 线程
  • 语音
  • 其他

Linux共享库、静态库、动态库详解

介绍

  • 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。

程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):

  1. 静态函数库,是在程序执行前就加入到目标程序中去了 ;

  2. 动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)

Linux中命名系统中共享库的规则:
在这里插入图片描述

静态库

静态函数库,是在程序执行前(编译)就加入到目标程序中去了

优点:

  1. 静态库被打包到应用程序中加载速度快

  2. 发布程序无需提供静态库,因为已经在app中,移植方便

缺点

  1. 链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
  2. 更新、部署、发布麻烦。

在这里插入图片描述

动态库

动态函数库,是在程序执行时动态(临时)由目标程序去调用

优点:

  1. 链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
  2. 程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。

缺点:

  1. 加载速度比静态库慢
  2. 发布程序需要提供依赖的动态库

在这里插入图片描述

库的制作

静态库的制作:

例如Calc文件夹里面包含include文件夹、lib文件夹、src文件夹、main文件
src文件夹下存放addc.c、div.c、mul.c、sub.c
include文件夹下存放head.h头文件,里面定义加减乘除
lib文件将存放.a文件,这样源代码就不用传递给用户,只需传递包含头文件的include文件夹,和包含库文件的lib文件夹

  1. 在src中将源代码.c或.cpp文件生成.o文件
gcc *.c -c -I ../include/

编译的时候如果头文件不在同一路径下需要 -I(大写的i)指定头文件的路径

  1. 将.o文件打包成.a静态库文件
ar rcs libmycalc.a *.o  

注意:可以将多个.o文件编译成一个静态文件
可以把制作好的库放到目录lib中,不放也行

  1. 命名规则

静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。

动态库的制作:

  1. 将源文件生成.o,需要一个参数fpic
gcc *c -c -fpic -I ../include/

-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。

  1. 打包成.so文件,需要一个参数shared
gcc -shared *.o -o libmycalc.so

-shared 指定生成动态库

  1. 命名规则

动态库文件名的命名方式是“libxxx.so”,库名前加”lib”,后缀用”.so”,“xxx”为动态库名。

库的使用

静态库的使用:

gcc main.c -I ./include  -L ./lib -lmycalc -o app	
  • -L :告诉gcc编译器从-L制定的路径去找静态库。默认是从/usr/lib 或 /usr/local/lib去找,此处修改为当前路径下
  • -l:(小写的l)是指定要用的动态库名称,库名砍头去尾(去掉lib和.a)
  • -o:指定生成的最终应用程序的名字
  • -I(大写i):指定头文件的路径(所有源代码.c文件定义在的头文件)

运行:

./app

动态库的使用:

前提:库文件存放在lib下,头文件存放在include下

gcc main.c -I ./include/ -L ./lib -lmycalc -o app
  • -lcalcufunc, -l是指定要用的动态库,库名砍头去尾

  • -L告诉gcc编译器从-L制定的路径去找动态库。默认是从/usr/lib 或 /usr/local/lib去找,此处修改为当前路径下

  • ./app运行时会提示No such file or directory,需要进行环境变量的设置

    • 创建临时路径

      • export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH"
        • export表示可以打开环境变量
        • 中间是动态库的位置,通过pwd可以查看
        • 该环境变量是临时的,当切换窗口会无法执行
    • 创建永久路径

      • 可以创建shell脚本,运行该脚本的时候会在当前路径下创建环境变量,切换窗口也可以执行
      • vi start.sh
      •   export LD_LIBRARY_PATH="/home/pi/lib"
          ./app	
        
      • chmod +x start.sh
      • ./start.sh
    • 永久设置:

      • 用户级别:
        • ~/.bashrc,配置完成之后,重启终端或者source ~/.bashrc
      • 系统级别:
        • /etc/profile,配置完成之后,重启计算机或者source /etc/profile

优质博文:Linux共享库、静态库、动态库详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值