一、什么是库
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
二、库的种类
linux下的库有两种:静态库和共享库(动态库)。
三、命名方式
静态库:lib库名.a
动态库:lib库名.so
区分一个概念:库是包含前缀lib以及后缀.a或者.so的一个整体
库名是去掉前缀和后缀剩下的部分
四、动态库和静态库的特点
静态库的特点:
1、使用静态库的时候,会将静态库的信息直接编译到可执行文件中
2、优点:当静态库被删除,对可执行文件没有影响
3、缺点:浪费内存空间。如果静态库被修改,可执行程序要重新编译
动态库的特点:加载器在加载动态库时,操作系统会先检查动态库是否因为其它程序已经将这个动态库信息加载到了内存中。如果没有加载到内存中,操作系统会将动态库载入内存,并将它的引用计数设置为1;如果已经加载到内存,仅将动态库的引用计数加1。
五、如何知道一个可执行程序依赖哪些库
ldd命令可以查看一个可执行程序依赖的共享库
例如# ldd + 路径/可执行程序
六、创建静态库和动态库的过程
静态库:a、创建.o文件
b、ar -cr lib库名.a *.o
动态库: a、创建.o文件 要使用-fpic选项
“-fpic”告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该代码的应用程序会将它连接到哪一段内存地址空间。这样编译出的hello.o可以被用于建立共享链接库。
b、 gcc -shared -o lib库名.so *.o
七、如何使用库
静态库:
a、如果静态库放在系统目录/lib或者/usr/lib下
执行方式为 gcc main.c -l库名
b、如果静态库没有放在系统目录下则执行方式为执行 gcc main.c -L 静态库路径 -l 库名。或者执行gcc main.c 路径/整个静态库
动态库:
a、如果放在系统目录下执行方式为 gcc main.c -l库名
b、如果没有放在系统目录下执行方式分为两种:
第一种:执行 gcc main.c -L 动态库路径 -l 库名,不过这种方式在执行可执行程序的时候可能出现如下错误
./a.out: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
解决方式:
1、在/etc/bash.bashrc文件中添加export LD_LIBRARY_PATH=$LD_LRBRARY_PATH:动态库的绝对路径。最后source /etc/bash.bashrc
2、在/etc/ld.so.conf.d目录下创建一个以.conf为后缀的文件,在这个文件中添加上动态库的绝对路径,最后执行sudo ldconfig
ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库.
第二种:如果第一种的方式都配置完之后出现如下错误
/usr/bin/ld: cannot find -laddsub
collect2: ld returned 1 exit status
这种错误说明编译器找不到需要链接的库,则执行gcc main.c 动态库路径/动态库
动态 |