一、库是什么
◼ 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。
◼ 库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。
◼ 库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。
◼ 库的好处:1.代码保密 2.方便部署和分发
一、动态库和静态库的工作原理
二、静态库的制作和使用
1.制作
2.使用
第一步:使用gcc将你需要打包的所有函数、类,编译成以 .o 为后缀名结尾的.o文件
gcc -c xxx.c xxx.c xxx.c xxx.c ...
//gcc -c 进行编译生成.o文件, 其中xxx代表要打包的文件名,之间用空格隔开
第二步:生成获取静态库
ar rcs xxx.a xxx.o xxx.o xxx.o ...
//生成静态库,其中第一个 xxx 是之前命名的库名 之后的 xxx 是.o文件名,空格隔开
第三步:使用静态库
在静态库使用的时候,头文件必须放到项目里面。不要以为生成了静态库,就不用头文件了,因为我们生成的库仍然需要头文件。
执行命令编译main函数
gcc main.c -o xxx -I ./include/ -l calc -L ./lib
//xxx 是指库名,不是库文件名
//-I 是指定main函数在include文件夹下搜索头文件,-L 指定main函数在lib下找库。
三、动态库的制作和使用
1.制作
2.使用
第一步:第一步:使用gcc将你需要打包的所有函数、类,编译成以 .o 为后缀名结尾的.o文件
gcc -c -fpic xxx.c xxx.c xxx.c ...
//生成位置无关的代码
第二步:生成获取动态库
gcc -shared xxx.o xxx.o xxx.o ... -o xxx.so
//生成动态库,最后一个xxx是库名
第三步:使用动态库
gcc main.c -o xxx -I ./include/ -l calc -L ./lib
//使用动态库编译main函数
运行时候出错:
./app: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
解决办法是添加动态库的环境变量:
用户级配置:
在用户home目录下,用vim .bashrc命令打开用户目录下的 .bashrc,添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/Linux/lesson02/library/lib
如下图所示。
四、动态库与静态库的优缺点
静态库优缺点:
优点:
1、静态库被打包到程序中加载速度快
2、发布程序时无需提供静态库,移植方便
缺点:
1、浪费内存,占用资源
2、发布、部署、更新时麻烦
动态库优缺点:
优点:
1、可以实现进程间资源共享
2、发布、部署、更新时简单方便
3、可以控制加载动态库
缺点:
1.加载速度比较慢
2、发布程序时需要提供动态库