库的制作和使用:
什么是库:
1 库是二进制代码
2 库是加了密的源代码
3 库是功能相近或者相似的函数的集合
库的作用:
1 代码的复用性, 提高了软件开发的效率, 而且稳定安全.
库的制作:
库分为静态库和动态库
库的名字: libtest1.a
材料: main.c fun1.c fun2.c head.h
main.c文件中调用了fun1.c和fun2.c中的函数
head.h文件中有fun1和fun2函数的声明
静态库的制作:
1 gcc fun1.c -o fun1.o
gcc fun2.c -o fun2.o
2 ar rcs libtest1.a fun1.o fun2.o
动态库的制作:
1 gcc -c -fpic fun1.c fun2.c
2 gcc -shared fun1.o fun2.o -o libtest2.so
(可一步生成 gcc -shared -fpic fun1.c fun2.c -o libtest2.so)
库的发布:
1 提供头文件
2 提供库文件
动态库找不到的问题分析和解决:
./main: error while loading shared libraries: libtest2.so: cannot open shared object file: No such file or directory
原因: 在执行的时候会根据路径去找动态库, 若找不到就会报错.
1 /usr/lib /lib
2 export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH (echo LD_LIBRARY_PATH)
3 在用户的配置文件.bashrc里面添加export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
然后执行. ~/.bashrc(或source ~/.bashrc)
4 在/etc/profile里面添加export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH,
然后. /etc/profile
5 在/etc/ld.so.conf里面添加库的绝对路径, 然后执行sudo ldconfig -v使配置生效
(export 查看环境变量
export | grep LIB 查看lib环境变量
unset LD_LIBRARY_PATH 删除环境变量)
ldd main查看使用了哪些库
nm main 查看有哪些函数 (-u 查看未定义函数)
动态库和静态库的优缺点:
静态库的优点:
1 执行速度快, 是因为静态库已经编译到可执行文件内部了
2 移植方便, 不依赖域其他的库文件
缺点:
1 耗费内存, 是由于每一个静态库的可执行程序都会加载一次
2 部署更新麻烦, 因为静态库修改以后所有的调用到这个静态库的可执行文件都需要重新编译
动态库的优点:
1 节省内存
2 部署升级更新方便, 只需替换动态库即可,然后再重启服务
缺点:
1 加载速度比静态库慢
2 移植性差
什么是库:
1 库是二进制代码
2 库是加了密的源代码
3 库是功能相近或者相似的函数的集合
库的作用:
1 代码的复用性, 提高了软件开发的效率, 而且稳定安全.
库的制作:
库分为静态库和动态库
库的名字: libtest1.a
材料: main.c fun1.c fun2.c head.h
main.c文件中调用了fun1.c和fun2.c中的函数
head.h文件中有fun1和fun2函数的声明
静态库的制作:
1 gcc fun1.c -o fun1.o
gcc fun2.c -o fun2.o
2 ar rcs libtest1.a fun1.o fun2.o
动态库的制作:
1 gcc -c -fpic fun1.c fun2.c
2 gcc -shared fun1.o fun2.o -o libtest2.so
(可一步生成 gcc -shared -fpic fun1.c fun2.c -o libtest2.so)
库的使用:
gcc main.c -I./ -L./ -ltest2 -o main库的发布:
1 提供头文件
2 提供库文件
动态库找不到的问题分析和解决:
./main: error while loading shared libraries: libtest2.so: cannot open shared object file: No such file or directory
原因: 在执行的时候会根据路径去找动态库, 若找不到就会报错.
1 /usr/lib /lib
2 export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH (echo LD_LIBRARY_PATH)
3 在用户的配置文件.bashrc里面添加export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
然后执行. ~/.bashrc(或source ~/.bashrc)
4 在/etc/profile里面添加export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH,
然后. /etc/profile
5 在/etc/ld.so.conf里面添加库的绝对路径, 然后执行sudo ldconfig -v使配置生效
(export 查看环境变量
export | grep LIB 查看lib环境变量
unset LD_LIBRARY_PATH 删除环境变量)
ldd main查看使用了哪些库
nm main 查看有哪些函数 (-u 查看未定义函数)
动态库和静态库的优缺点:
静态库的优点:
1 执行速度快, 是因为静态库已经编译到可执行文件内部了
2 移植方便, 不依赖域其他的库文件
缺点:
1 耗费内存, 是由于每一个静态库的可执行程序都会加载一次
2 部署更新麻烦, 因为静态库修改以后所有的调用到这个静态库的可执行文件都需要重新编译
动态库的优点:
1 节省内存
2 部署升级更新方便, 只需替换动态库即可,然后再重启服务
缺点:
1 加载速度比静态库慢
2 移植性差