什么是库
库是一种可执行代码的二进制形式,通常把一些常用的函数制作成各种函数库,然后被系统载入内存中运行
两种库 - 载入的时间不同
静态库:在链接阶段被加载到目标文件中程序运行时不需要静态库编译后的可执行程序体积较大
命名:libXXX.a
动态库:编译的时候不会被链接进来,在程序执行的时候被载入程序运行时需要动态库编译后的可执行程序体积不变
命名:libXXX.so
静态库的制作
使用GNU下的ar 工具制作
(1) 写好功能文件和头文件 - hello.c 和 hello.h
(2) 将hello.c 编译生成目标文件 hello.o
gcc hello.c -c -o hello.o
(3) 使用ar 将hello.o制作成静态库
ar crs libmyhello.a hello.o - hello.o不能放在前面
(4) 测试
gcc test.c -lmyhello -L.
-l:指定要链接的库文件
-L:指定库文件所在的路径
制作动态库
使用gcc工具
(1) 写好功能文件和头文件 - hello.c 和 hello.h
(2) 使用gcc编译生成动态库
gcc hello.c -fpic -c -o hello.o //可以不加
gcc hello.o -shared -o libmyhello.so
或者:gcc hello.c -fpic -shared -o hello.o
-shared:指定生成动态链接库
-fPIC(-fpic):表示编译为位置独立的代码。位置独立的代码即位置无关代码,
在可执行程序加载的时候可以存放在内存内的任何位置。若不使用该选项则编译后的代码是位置相关的代码,
在可执行程序加载时是通过代码拷贝的方式来满足不同的进程的需要,没有实现真正意义上的位置共享
参数
c:表示无提示方式创建文件包
r:在文件包中替代文件
s:强制重新生成文件包的符号表
(3) 测试
gcc test.c -lmyhello -L.
ldd:查看某个可执行程序加载库的情况
注意:当静态库和动态库重名时,系统会以动态库为准
动态库的加载过程
执行可执行程序时,会加载动态库,寻找存放动态库的配置文件
存放动态库的配置文件的默认目录为 /etc/ld.so.conf.d/以及所属的众多子目录内的配置文件
配置文件指定的库文件的绝对路径为 /usr/lib或/lib
根据配置文件中的库文件的路径去往/usr/lib 或/lib,将动态库加载到可执行程序中
使动态库生效
- 将动态库拷贝到 /usr/lib或/lib目录下
- 修改LD_LIBRARY_PATH环境变量
sudo vim /etc/bash.bashrc
在最后添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linux/beike/lib
重启终端才能生效