1 库
1.1 定义
库是一个二进制文件,包含的代码可被程序调用。如标准c库、数学库、线程库。
1.2 库的特点
1、库中包含很多函数,程序调用库其实是调用库中的函数;
2、库有源码,可以下载库源码,然后自己编译(也可以修改优化库源码),生成二进制文件库。也可以直接安装库的二进制包;
3、在Linux下,库一般放在/lib或/usr/lib目录下。
1.3 库的分类
静态库和共享库。
2 静态库
2.1 定义
程序源文件编译(链接)时把静态库中相关代码(是需要的代码而不是静态库的全部代码)复制到可执行文件中。
2.2 优点
1、程序中已包含需要的静态库代码,运行时不再需要静态库;
2、程序运行时无需加载库,运行速度快。
2.3 缺点
1、占用更多的磁盘和内存空间;
2、静态库升级后,程序需要重新编译链接。
2.4 静态库的创建步骤
1、设计静态库中函数的功能与接口;
2、编写库源码.c文件,如:hello.c;
3、编译生成目标.o文件,如命令:$ gcc -c hello.c -Wall;
4、创建静态库hello,如命令:$ ar crs libhello.a hello.o;
libhello.a为生成的静态库文件。其命名规则为:必须是lib开头,.a后缀结尾。注意: libhello.a叫库文件名,hello叫库名,编译时要指定库名,而不是库文件名。
5、查看库中符号信息(即函数),如命令:$ 你们里边hello.a。
2.5 静态库中的文件介绍
1、库源码,如hello.c;
2、库目标文件,如hello.o;
3、库文件名,如libhello.a;
4、库名:hello。注意:没有具体的文件对应库名,它是虚拟的;也可以这样说,hello.c、hello.o和libhello.a构成了hello。
3 共享库
3.1 定义
程序源文件编译(链接)时仅记录用到那个共享库中的那个符号(函数),不复制共享库中相关代码。
3.2 优点
1、程序中不包含库中代码,程序尺寸小;
2、多个程序可以共享同一个库;
3、库升级方便,无需重新编译程序;
4、较静态库,共享库使用更加广泛。
3.3 缺点
程序运行时需要加载库。
3.4 共享库的创建步骤
1、设计共享库中函数的功能与接口;
2、编写库源码.c文件,如:hello.c,bye.c;
3、编译生成目标.o文件,如命令:$ gcc -c-fPIC hello.c bye.c -Wall;其中 -fPIC 的意思是生成与位置无关的代码;
4、创建共享库common,如命令:$ gcc -shared -o libcommon.so.1 hello.o bye.o;
libcommon.so.1 为生成的共享库文件。其命名规则为:必须是lib开头,common是库名,.so是共享库后缀,.1是共享库版本号。注意: libcommon.so.1 是共享库文件,共享库库名是common。
5、为共享库文件libcommon.so.1 创建链接文件libcommon.so,其命令是:$ In -s libcommon.so.1 libcommon.so。符号链接文件命名规则:lib<库名>.so。
3.5 让系统找到要加载的共享库的三种方式
1、把库拷贝到/usr/lib和/lib目录下;
2、在LD_LIBRARY_PATH环境变量中添加库所在路径(缺点:每打开一个Linux终端shell都要添加一次);
3、添加/etc/ld.so.conf.d/*.conf文件,执行ldconfig刷新。