一、什么是库?
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries)
库是一种可执行的二进制形式、就是将源代码转化为二进制格式,相当于进行了加密,别人可以使用库,但是看不到库中的内容。
二、如何制作并使用静态库?
a. 静态库的制作和使用
(1)命名的规则
静态库文件名的命名方式是“libxxxxx.a”,库名前加“lib”,后缀用“.a”,“xxxxx”为静态库的真实名字
(2)制作的步骤
原材料:.c或.cpp文件
a. 首先将.c文件生成.o文件,通过 gcc xxxx.c -c 生成.o文件
b. 将.o文件进行打包成后缀为.a的静态库文件
通过 ar rcs libxxx.a xxx.o 的方式进行打包。
(3)静态库的使用
gcc jsq.c -ltestjsq -L ./ -o main
-l(小写的L):指定要用的静态库,库名要看头去尾(即要去掉lib和后缀.a)
-L(大写的L):告诉gcc编译器从-L指定的路径去找静态库,如果没有指定,则默认从/usr/lib或/usr/local/lib去找 ,则这里有指定./,-L ./的意思就是从当前路径去找
-o(小写的O):指定生成的可执行文件
运行:直接像我们平时运行一样./main
例子:
jsq.c文件
#include<stdio.h>
#include "jsqGNeng.h"
int main()
{
int a;
int b;
int ret;
float ret1;
printf("请输入第一个数\n");
scanf("%d",&a);
printf("请输入第二个数\n");
scanf("%d",&b);
printf("开始计算\n");
ret = add(a,b);
printf("相加为%d\n",ret);
ret = min(a,b);
printf("相减为%d\n",ret);
ret = mul(a,b);
printf("相乘为%d\n",ret);
ret1 = div(a,b);
printf("相除为%f\n",ret1);
return 0;
}
jsqGNeng.c
int add(int a,int b)
{
return a+b;
}
int min(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
float div(int a,int b)
{
return (float)a/b;
}
jsqGNeng.h
int add(int a,int b);
int min(int a,int b);
int mul(int a,int b);
float div(int a,int b);
这样就生成静态库文件libtestjsq.a
给别人时提供libtestjsq.a 和相关头文件、主函数
三、如何制作并使用动态库?
(1)命名的规则
动态库文件名的命名方式是“libxxxxx.so”,库名前加“lib”,后缀用“.so”,“xxxxx”为动态库的真实名字。
(2)制作的步骤
-shared 指定生成动态库
gcc -shared -fpic xxx.c -o libxxx.so
(3)动态库的使用
因为动态函数库是在程序执行时动态(临时)由目标程序去调用,所以找不到这个库,默认会在/usr/lib/里面找。
那么引用动态库,怎么指定动态库的位置?
本次用了文中的方法二
这个只是临时的,如果换了个窗口依然不能运行。
解决方法:写个脚本
四、静态库和动态库的区别
静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ;
优点: 1.运行快2.发布程序无需提供静态库,因为已经在app中,移植方便
缺点:1.程序大2.更新部署发布麻烦
动态函数库,是在程序执行时动态(临时)由目标程序去调用
优点:1. 程序小、节省内存2.升级简单。
缺点: 1.运行慢2.需要提供依赖的动态库。
学习笔记,仅供参考