库(静态库和动态库的分析)
6/28/2016 7:04:01 PM
本质上来说,是一种可执行代码的二进制形式,可以被os载入内存执行。由于windows/linux的本质不同,因此两者的库的二进制是不兼容的。
分类:
- 静态库:程序编译时链接到目标代码中,程序运行中不再需要静态库,因此体积比较大;
- 动态库:编译时,不会链接到目标文件中,而是在运行时被载入。因此在程序运行时还需要动态库存在,代码体积小。
静态库
创建静态库
创建静态库使用ar命令,将数个.o文件转换成.a(归档文件)
$ ar crs libmylib.a hello.o
命名规则:lib+libname+.a
使用静态库
$ gcc -o exefile main.c -L. -lmylib
其中 :
-L. 是制定库文件所在的文件夹,这里是“.”当前文件夹
-l*mylib**: 取lib和.a之间的名字mylib
当创建的库文件在当前工作目录下时,需要制定库文件的路径。因为系统默认的库文件是放在默认的路径(/usr/lib/)下,因此需要使用 “-L+路径” 来自己制定。
静态库特点
- 运行时与库无联系,可移植性好;
- 浪费空间资源,因为需要在编译时就将库链接到程序中;
动态库
创建动态库
gcc -fPIC -Wall -c hello.c
gcc -shared -o libmyhello.so hello.o
命名规则: lib+libname.so
其中:
-fPIC= Position Indipendent Code 创建与地址无关的位置独立程序代码,这样在可执行此程序运行装载这些代码时,可以将其放在可执行程序的内存的任何地方。
-Wall = Warning All 创建时输出警告信息
-shared 生成动态链接库
动态库的使用
当生成的动态库文件.so在当前路径下,如果直接使用的话,会出现无法找到制定的库文件的。原因是libmylib.so没有在系统中建立索引,因此在执行的时候无法找到。
如何解决动态链接库的路径问题
方法一:
把库文件copy到/usr/lib和/lib下即可;
方法二:
在LD_LIBRARY_PATH环境变量中加上库文件所在的路径
export LD_LIBRARY_PATH=/home/workspace/xxx
方法三:
在/etc/ld.so.conf.d/下创建一个新的my.conf文件,然后将库文件路径添加进去,并执行ldconfig刷新即可;
# cd /etc/ld.so.conf.d
# vi my.conf
/*在my.conf中添加库文件路径,然后保存退出*/
# ldconfig