库:一组别人实现好的函数接口
1.命名方法
静态库 : libname.a
动态库 : libname.so
注意 :库的名字是name
2.链接动态库和静态库的区别
预处理,编译,汇编,链接(连接库)
(1)链接静态库
如果链接的是静态库,编译器将程序中调用的库中函数接口的实现代码链接到可执行
文件中,生成可执行文件体积大.程序运行的时候,不需要库支持。
(2)链接动态库
如果链接的是动态库,编译器将程序中调用的函数所在的库的名字记录在可执行文件中
,生成可执行文件体积小.程序运行的时候,需要[OS]加载动态库。
3.制作静态库
(1)将.c文件编译成.o文件
gcc -c file.c -o file.o
....
(2)将.o文件打包成静态库
ar -cr libname.a *.o
4.gcc 链接库的参数
注意:gcc 默认到/usr/lib 和/lib链接库,gcc只能识别它自带的库,第三方库[不是编译器自带库]无法识别
-L 告诉编译器库的路径
-l 告诉编译器库的名字
例如:
gcc main.c -L 库的路径 -l库的名字
5.制作动态库
(1)将.c文件编译成.o文件
gcc -c file.c -o file.o
....
(2)将.o文件打包成动态库
gcc -shared *.o -o libname.so
---------------------------------------------------
查看可执行文件所依赖的动态库:
readelf -a 可执行文件名 | grep "Shared"
----------------------------------------------------
6. OS 加载库的时候,默认的搜索路径
(1)环境变量LD_LIBRARY_PATH所包含的路径
添加环境变量:
export 环境变量名=$环境变量名:新的路径
注意:
直接通过export命令,是临时添加,如果永久有效,将命令写道配置文件
<1>用户主目录下的.bashrc文件 [当前登录的用户打开终端的时候会执行一次]
<2>/etc/bash.bashrc [所有的用户打开终端的时候都会执行一次]
例如:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linux/mylib
(2)/usr/lib 和 /lib
7.当静态库和动态库同时存在,编译器默认链接的是动态库 。
如果想强制链接静态库,需要加上 -static 参数
8.给库加上版本号
libtest.so.0.1 , libtest.so.0.2
让编译器链接库成功,必须创建创建一个软链接
ln -s libtest.so.0.2 libtest.so