库(动态库/静态库)

来源:互联网 发布:知乎 日韩军力对比 编辑:程序博客网 时间:2024/05/21 15:40

库(静态库和动态库的分析)

6/28/2016 7:04:01 PM

本质上来说,是一种可执行代码的二进制形式,可以被os载入内存执行。由于windows/linux的本质不同,因此两者的库的二进制是不兼容的。

分类:

  1. 静态库:程序编译时链接到目标代码中,程序运行中不再需要静态库,因此体积比较大;
  2. 动态库:编译时,不会链接到目标文件中,而是在运行时被载入。因此在程序运行时还需要动态库存在,代码体积小。

静态库

创建静态库

创建静态库使用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+路径” 来自己制定。

静态库特点

  1. 运行时与库无联系,可移植性好;
  2. 浪费空间资源,因为需要在编译时就将库链接到程序中;

动态库

创建动态库

gcc -fPIC -Wall -c hello.cgcc -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
0 0
原创粉丝点击