库的概念
- 介绍:
库是一个二进制文件,包含的代码可被程序调用
标准C库、数学库、线程库…
库有源码,可下载后编译;也可以直接安装二进制包
位置一般放在:/lib /usr/lib - 库的知识
库是事先编译好的,可以复用的代码
在os上运行的程序基本上都要使用库,使用库可以提高开发效率
window和Linux下库文件的格式不兼容
Linux下包含静态库和动态库 - 静态库的特点
编译时把静态库中相关代码复制到可执行文件中
程序中已包含代码,运行时不再需要静态库
程序运行时无需加载库,运行速度更快
占用更多磁盘和内存空间
静态库升级后,程序需要重新编译链接 - 案例如下:
注:此时生成hello.o文件,但不是可执行文件,没有链接库 - 静态库创建
静态库
创建静态库步骤:
1 . 编写库文件代码,编译为.o 目标文件。
2. ar 命令 创建 libxxxx.a 文件
ar -rsv libxxxx.a xxxx.o
ar 参数如下:
注意:1 静态库名字要以lib开头,后缀名为.a
2 没有main函数的.c 文件不能生成可执行文件。
链接错误:
test.c:(.text+0x15):对‘hello’未定义的引用
collect2: error: ld returned 1 exit status
含义:表示hello函数在编译的源码内没有找到实现
解决:实现代码或者找到对应函数的库并且链接它。
链接静态库:
gcc -o 目标文件 源码.c -L路径 -lxxxx
-L 表示库所在的路径
-l 后面跟库的名称 - 案例如下:
注:ar -t .a文件:可以得到是由哪个文件得到的 - 如何使用上述的静态库
注:出现以下错误是由于没有链接库
- 链接库后得到如下(如果将test可执行文件转移到其他目录下,不依赖库文件,也可以执行):
- 动态库
编译时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码
程序不包含库中代码,尺寸小
多个程序可共享同一个库
程序运行时需要加载库
库升级方便,无需重新编译程序
使用更加广泛 - 共享库创建
动态库的生成步骤:- 生成位置无关代码的目标文件
gcc -c -fPIC xxx.c xxxx.c … - 生成动态库
gcc -shared -o libxxxx.so xxx.o xxx.o … - 编译可执行文件
gcc -o 目标文件 源码.c -L路径 -lxxxx
- 生成位置无关代码的目标文件
- 代码如下:
注:执行动态库的可执行文件错误
./test: error while loading shared libraries: libmyheby.so: cannot open shared object file: No such file or directory
含义:可执行文件所使用的动态库找不到
解决办法:- 找到动态库,添加到/usr/lib里面
- 或者使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的动态库目录,注意在这么加的路径后,只能在当前shell有效
- 添加在~/.bashrc 文件里面,适用于所有shell,加入export LD_LIBRARY_PATH = LIB_PATH
- 在/etc/ld.so.conf.d/下加入路径
- 如何找到一个文件的动态库的名称,如下: