库是一个二进制可执行文件,与二进制可执行程序比较,库是不能单独运行的。
库中存放的是功能函数,没有主函数(main函数)
库需要被载入到内存中使用
标准的基础库中存放了很多已经写好的,成熟的,可以复用的功能代码,例如printf, scanf
不同操作系统有自己的库,不兼容
| windows | Linux | |
|---|---|---|
| 静态库 | *.lb | libxxx.a |
| 动态库 | *.dll | libxxx.so |
通过静态库封装的功能函数,在程序编译到 链接库 步骤的时候,会将函数 继承 到可执行程序中。
优点:
缺点:
gcc -c func.c -o func.o 一步完成预处理,编译,汇编
ar -crs libxxx.a func.o 生成一个静态库,库的名字叫做xxx
ar -crs libxxx.a func1.o func2.o func3.o
ar : 用于创建或操作静态库
-c : 创建静态库
-r : 将文件插入静态库或者替换静态库中的同名文件;
-s : 重置静态库索引
gcc main.c -L库的路径 -l库的名字 最终生成一个a.out可执行二进制程序 gcc main.c -L库的路径 -l库的名字 -o main 最终生成一个main可执行二进制程序 -l:小写的L
用动态库封装的功能函数,把库函数的链接推迟到 程序运行 的时候。
当程序执行到库函数的时候,会到内存中找动态库函数。
优点:
缺点:
gcc -fPIC -c func.c -o func.o 完成预处理 编译 汇编
gcc -shared -o libxxx.so func.o 生成一个动态库,库的名字是xxx;
gcc -shared -o libxxx.so func1.o func2.o func3.o

原因:环境变量没有配置,若没有配置,则会默认到/lib/ 或者 /usr/lib/ 目录下查找动态库
sudo mv ./libmyfunc.so /lib/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库所在目录的绝对路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/mydir/23071/02_socket/09_library/
只在设置终端有效
修改配置文档
1. cd /etc/ld.so.conf.d
2. sudo touch xxx.conf (xxx自定义可以修改)
3. sudo vim xxx.conf 将动态库所在目录的绝对路径写入到文件中,且一行一个动态库目录路径。
4. 保存退出后,终端输入 sudo ldconfig 刷新环境变量