1.什么是库文件?
库文件实际上就是封装了一大堆已经编译完成的代码文件通过连接这个库进而获取到响应函数实现.
举个例子: 就是当我们要把自己的代码给别人用的时候,又不想给别人源代码,就需要封装成库文件。
**** 注意: 库文件里不能有main函数 ****
2.Linux下库的种类?
Linux下的库文件一般分为静态库和动态库两种。
3.静态库的制作与使用
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了
静态库的文件命名 : libxxxx.a ->对应Windows下的.lib文件
先生成.o文件成libCalc.a文件
命令 ar rcs libCalc.a *.o 或则 ar -cr libCalc.a * .o
这样就生成了 libCalc.a 的静态库文件, lib为前缀 ,.a为后缀, Calc是我们起的名字
使用时候,就需要我们来链接库
当我们写命令 gcc a.c -o app -lCalc 来表示我们要链接Calc这个库,但是会发现会报错:cannot find -lCalc
我们会有疑问,库文件本来就在这个目录下呀,但是为啥找不到?
这是因为库的查找也有一个默认路径, 但是这个默认路径并不包含当前这个路径,所有我们就有(1)第一种方法,将库的链接放到指定的路径下。
将这个库放置到指定路径下,/lib64 或 /usr/lib64
这样我们再去编译的时候就不会报错了,但是一般情况下我们不会这样做,因为会污染根目录里的库文件,所以我们可以有第二种方式。
(2)设置 LIBRARY_PATH环境变量
export LIBRARY_PATH=$LIBRARY_PATH
如果我们不加$ ,会直接把以前的环境变量给覆盖掉,而加$后,相当于在末尾追加。
(3)通过gcc -L 选项设置链接库的默认搜索路径
这种方法最为常见, -lCalc 是指定的链接库的名称, -l 是指定库的名称,-L是指定库的搜索路径 ./是当前路径
4.动态库(共享库)的制作与使用
动态库与静态库相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销
动态库一般后缀名为“.so”,
gcc 在编译时默认使用动态库
我们使用gcc来生成动态库
gcc -fPIC -c add.c -o add.o -I …/clude
第一行是进行编译,将.c 文件转换为.o文件 ,-I 表示包含头文件所在目录
-fPIC 表示生成与位置无关代码, 因为动态库的代码动态运行时才加载,这个动态库是要被映射到程序的各个独立的虚拟地址空间的,无法保证每个程序将他的动态库加载到同一个位置,因此-fpic便于映射到每一个地址
**
*gcc --share .o -o libCalc.so
第二行的share代表生成一个动态库,
动态库的使用 :只有动态库才会在运行的时候加载库,
1.程序运行时,若程序是动态链接生成,运行时需要到指定的目录下加载动态库,即将库文件放到指定的路径下
2.也可以使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: ./ 环境变量的设置
来声明程序运行时库的加载路径。
ldd main 查看该问文件所依赖的库。