文章目录
一、Linux中的库文件
库文件其实是一个二进制文件,在这个二进制文件中,不能包含main函数。
库文件可以保护用户的代码实现,也不影响其他的用户使用。
就是将库文件发送给客户,而不把.c文件发送给对方。
库文件分为静态库和动态库。
在Windows中库的格式:
静态库:xxx.lib
动态库:xxx.dll
//----------------------------------------------------------------------------------------
在linux中库的格式:
静态库:libxxx.a 【其中xxx为库名,就比如libc.a c就是库命 】
动态库:libxxx.so 【其中xxx为库名,就比如libc.so c就是库命 】
实际开发中,两者都有使用,不过动态库的使用比静态库多。
二、 静态库
1、静态库的特点
静态库格式为:libxx.a 是一个二进制文件。
如果用户想要使用这个库,就要将自己的库文件和.c文件编译生成一个可执行文件(将库函数放在可执行文件中),
所以静态库生成的可执行文件体积较大,但是效率较高,因为不依赖于libxx.a库文件,直接就可以执行可执行文件,更新比较麻烦。
2、静态库的制作
gcc -c add.c -o add.o //只编译不链接
ar -cr libadd.a add.o
#依赖于add.o生成libadd.a静态库 其中libadd.a中的add是库名(add可以随意)
其中:ar :制作静态库的命令
-c :创建静态库
-r :将库文件放在系统的库目录中
之后将.h文件移动到inc文件夹,将.c文件(除了main.c文件)移除,发给客户。
3、静态库的使用
gcc main.c -L ../lib -l add
其中:
-L :指定编译生成可执行文件需要的库的路径,例子中后面跟的 ../lib 就是库文件所在的路径
-l :链接编译所使用的库 库的名字 (小写的L)(其中libadd.a中的add是库名(add可以随意))
-I :指定头文件的路径 (有.h文件就要指定路径)
三、动态库
1、动态库的特点
动态库格式:libiadd.so 是一个二进制文件
动态库生成的可执行文件体积较小,效率较低(只是相对于静态库)其实效率还是挺高的。
2、动态库的制作
gcc -fPIC -shared add.c -o ../lib/libadd.so -I ../inc
// -I 为链接(库文件)头文件路径(同上面静态库使用参数的介绍),
//如果链接上库文件的话,add.c里加上#include "add.h"就不会报错了
其中:-fPIC : 忽略文件位置 如果没加-I ../inc就不能包含add.h
-shared:标识生成动态库
add.c :生成库所要依赖的.c文件
../lib/libadd.so:生成动态库,存放动态库的 路径及名字
这个意思就是,生成库文件放在上一级路径下,并命名为libadd.so
将.c文件删除,不删除main.c文件,根据使用方式,选择对动态库的移动。
3、动态库的使用
第一步.编译可执行程序依赖动态库
-L:指定库的路径
-l:链接使用的库
-I :指定头文件路径
gcc main.c -L ../lib/ -ladd -I ../inc/
第二步.执行可执行程序(指定库的路径)
方式1:将自己的库放在/lib(系统库文件)
sudo mv libadd.so /lib
./a.out
方式2:通过指令命令 指定库的路径(只在当前终端生效)
export LD_LIBRARY_PATH=../lib/
./a.out
方式3:通过修改库的配置文件让其生效sudo (修改环境变量,添加文件的路径)
sudo vi /etc/ld.so.conf.d/libc.conf
加上一行/mnt/......../lib (库的所在路径)
sudo ldconfig (使配置文件重新生效)
./a.out
四、静态库与动态库的区别
1、静态库:
1、libname.a格式命名
2、在程序编译时,直接将静态库拷贝到可执行程序中,因此可执行文件比较大
3、可执行程序脱离静态库后不受影响
4、静态库修改后,程序需要重新编译生成新的可执行文件
2、动态库:
1、libname.so格式命名
2、可执行程序编译时,不会连接到动态库,而是在程序执行的时候,将动态库加载到内存中,内存中最多只有一份,可执行程序比较小
3、脱离动态库后,可执行程序会崩溃
4、动态库修改后,不需要重新编译程序