C库
库的概念
就是把一些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用;本质上来说库是一种可执行代码的二进制形式
库的分类
静态库和动态库,本质区别是代码被载入时刻不同。
1) 在程序编译时会被连接到目标代码中。
优点:
程序运行时将不再需要该静态库;
运行时无需加载库,运行速度更快缺点:
静态库中的代码复制到了程序中,因此体积较大;
静态库升级后,程序需要重新编译链接2)是在程序运行时才被载入代码中。
优点:
程序在执行时加载动态库,代码体积小;
程序升级更简单;
不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。缺点:
运行时还需要动态库的存在,移植性较差
动态库 | 静态库 | |
---|---|---|
linux | .so | .a |
windows | .dll | .lib |
静态库的制作
1.将源文件编译生成目标文件
==gcc -c xxx.c -o xxx.o==
2.创建静态库,用ar 命令,将.o文件生成.a文件
==ar crs libxxx.a xxx.o==
3.测试静态库的使用
==gcc main.c -L指定的库的路径-l指定库名==
4.运行查看结果
动态库的制作
1.创建一个与地址无关的目标文件
==gcc -fPIC -c xxx.c -o xxx.o==
2.创建动态库
==gcc -shared -o libxxx.so xxx.o==
3.测试使用
==gcc xxx.c -L指定路径 -l指定的库名==
4.执行
错误原因
动态库被加载时会优先从/lib下寻找库文件
解决方法
1.把库文件拷贝到 /usr/lib
sudo cp libxxx.so /usr/lib
2.在LD_LIBRARY_PATH环境变量中加上库所在路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
注意:只在当前终端有效
3.添加/etc/ld.so.conf.d/*.conf文件
思路 : 将libxxx.so文件移到环境变量中或者使本文件所在目录添加到环境变量中