动静态库的制作
本质上来说库是⼀种可执行代码的⼆进制形式,可以被操作系统载入内存执行。
可分为两种:
静态库:.a(linux)、.lib(windows)
动态库:.so(Linux)、.dll(windows)
静态库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再
需要静态库
编译时默认使用的是动态库,因为使用静态库会导致文件的体积变大。
只有在库中找不到动态库.so时才会使用默认使用静态库
静态库生成
这里是Makefile中的脚本程序库名为"my_pow",但是要加上前缀lib以及静态库后缀.a
我们在my_pow.c中已经实现了相关方法,通过gcc -c生成对应的.o文件,即可通过
'ar' 制作静态库
-r replace
-c create
制作完成后我们可以使用ar -tv查看库相关信息
-t 列出静态库中的文件
-v 详细信息
静态库的使用
前面我们说过,我们制作的静态库的库文件名为libmy_pow.a
前缀说明是个库文件,后缀说明是静态库(动态库.so,静态库.a)
在使用时我们需要去掉前后缀,实际上的库为my_pow
-l(小写的L) 指定库文件名(去掉前后缀)
-I(大写的i) 指定头文件路径
-L 指定库文件路径
因为是静态库,所以即使我们在制作好可执行程序后删除掉静态库也是没问题的,因为静态库已经被写在程序里了
动态库
动态库的名字与静态库类似,只不过后缀从.a改成了.so
从.c文件到.o文件时也与上面有点区别,-fPIC为生成“与位置无关码”,生成.o文件时加上即可
最后再用.o文件通过加上-shared指定生成的是动态库即可
此时我们可以看到,动态库已经顺利生成了
不过光是这样还不够,我们还需要指定动态库搜索路径
一是选择将动态库加入系统默认的搜索路径中,例如/usr/lib、/usr/local/lib、/lib64等
二是在环境变量中指定增加动态库搜索路径
像这里我们就增加了在环境变量中增加创建动态库搜索路径让我们的动态库能够被找到
如果我们要增加搜索路径,我们可以这么写
':'作为分隔符,说明我们要创建多个搜索路径,后面的$LD_LIBRARY_PATH则是将原来的内容放在里面,所以此时该环境变量的实际值则为
LD_LIBRARY_PATH=/home/lyl:/home/lyl/test
我们就有以':'为分隔符,增加了两个动态库搜索路径