库是什么?
- 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。
如何使用?
- 用户需要同时具有头文件和库。
linux库——分文件编程
关于头文件的引入:
-
<>会在usr/include或usr/local/include下找
-
""会在当前路径下找
分文件编程主要是将功能性函数分开
功能性函数:
- 串口
- 网络
- 线程
- 语音
- 其他
Linux共享库、静态库、动态库详解
介绍
- 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):
-
静态函数库,是在程序执行前就加入到目标程序中去了 ;
-
动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
Linux中命名系统中共享库的规则:
静态库
静态函数库,是在程序执行前(编译)就加入到目标程序中去了
优点:
-
静态库被打包到应用程序中加载速度快
-
发布程序无需提供静态库,因为已经在app中,移植方便
缺点:
- 链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
- 更新、部署、发布麻烦。
动态库
动态函数库,是在程序执行时动态(临时)由目标程序去调用
优点:
- 链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
- 程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
缺点:
- 加载速度比静态库慢
- 发布程序需要提供依赖的动态库
库的制作
静态库的制作:
例如Calc文件夹里面包含include文件夹、lib文件夹、src文件夹、main文件
src文件夹下存放addc.c、div.c、mul.c、sub.c
include文件夹下存放head.h头文件,里面定义加减乘除
lib文件将存放.a文件,这样源代码就不用传递给用户,只需传递包含头文件的include文件夹,和包含库文件的lib文件夹
- 在src中将源代码.c或.cpp文件生成.o文件
gcc *.c -c -I ../include/
编译的时候如果头文件不在同一路径下需要 -I(大写的i)指定头文件的路径
- 将.o文件打包成.a静态库文件
ar rcs libmycalc.a *.o
注意:可以将多个.o文件编译成一个静态文件
可以把制作好的库放到目录lib中,不放也行
- 命名规则
静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。
动态库的制作:
- 将源文件生成.o,需要一个参数fpic
gcc *c -c -fpic -I ../include/
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
- 打包成.so文件,需要一个参数shared
gcc -shared *.o -o libmycalc.so
-shared 指定生成动态库
- 命名规则
动态库文件名的命名方式是“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共享库、静态库、动态库详解