一、linux下的静态库
静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在!
二、linux下动态库的构建和使用
1、动态库的构建
gcc -fPIC -shared -o lib库名.so 源文件列表
例:
gcc -fPIC -shared -o libmylib.so max.c min.c
2、动态库使用
gcc -o 最终的可执行文件 源文件列表 -L 动态库的目录 -l库名
例子:
已经将int getMax(int,int)和getMin(int,int)打包在了libmylib.so中了,现在你即可把libmylib.so复制希望用你的库函数的人了!!
使用你的库函数的人可能回这样使用:
//test.c
int getMax(int,int);
int main()
{
int x,y;
int max;
scanf(“%d%d”,&x,&y);
max=getMax(x,y);//getMax是在你的库函数中已经实现了的,所以不用别人在实现了,直接拿来用就行了!!
printf(“max=%d\n”,max);
return 0;
}
执行该命令:gcc -o test test.c 会报错:提示找不到getMax;
正确的命令:gcc -o test test.c -L libmylib.so存放的目录 -lmylib
错误的写法:gcc -o test test.c -L libmylib.so存放的目录 -llibmylib.so
查看动态库中的标号:
readelf -s 动态库名
查看可执行文件运行时所依赖的动态库:
(1)ldd 可执行文件名
(2)readelf -d 可执行文件名|grep Shared
3、动态链接的可执行文件的运行(任选一种即可)):解决的是可执行文件在运行时找动态库
(1)将动态库复制到/lib或/usr/lib目录下;(在嵌入式开发,推荐用此方法!)
命令:
正确:sudo cp libmylib.so /lib/
错误:sudo cp libmylib.so /lib/mylib.so
错误:sudo cp libmylib.so /lib/libmylib
(2)将动态所在目录路径添加到环境变量LD_LIBRARY_PATH
例如:
export LD_LIBRARY_PATH=动态库所在的目录:$LD_LIBRARY_PATH
如果需要LD_LIBRARY_PATH一直生效,则需把上面的语句添加到~/.bashrc文件中末尾去。
命令:
gedit ~/.bashrc
偷懒的办法(慎用):
echo export LD_LIBRARY_PATH=$PWD:\$LD_LIBRARY_PATH>>~/.bashrc
(3) 将动态所在的目录添加到/etc/ld.so.conf中,启动会自动加载/etc/ld.so.conf配文件,如果需要立即生效,执行命令:ldconfig
命令:
sudo gedit /etc/ld.so.conf
三、静态库、动态库使用上的区别
静态库被调用的代码生成可执行文件时会被立即复制到执行性文件中去;
动态库被调用的代码在可执行文件运行时才会被加载到可执行文件中去。