前戏:
今天聊一聊动态链接库!
Windows: dynamic link library (DLL),后缀?xxx.dll嘛!
Linux: 是Shared Library .后缀是啥?xxx.so嘛!
简单的理解就是:把其封装为类库,其他程序都可以动态调用就完事了
通用性、封装性,毕竟有些代码不想让别人看到。
Ps:详细解释 http://bbs.chinaunix.net/thread-1281954-1-1.html
正文:
-
将源文件.c编译成动态链接库.so
gcc -shared me.c -o libme.so
主程序会根据头文件名称自动加上lib和.so后缀找寻动态链接库,编译时注意书写
-
编译
联合编译:
gcc fatsnake.c me.c -o fatsnake
(1)使用动态链接库编译(就不用制定所有源文件了)------------------------手动指定我的动态链接库在哪
gcc –L /root/ -l me fatsnake.c -o fatsnake
-L 动态链接库的文件夹位置
-l 动态链接库的库名 (去除最前面的lib和.so就是库名)
(2)ldd 主程序名 查看依赖
ldd fatsnake
问:失败原因是操作系统无法找到libme.so???
答:其实Linux和windows一样,有个类似system32的系统库文件夹。各种公共类库都放于此
CentOS中有和windows很类似的两个存放公共库的文件夹
/lib 内核级
/usr/lib 用户系统级
/usr/lib64/ 64位系统才有
你要把你做好的库 瞎放也没关系,此处暂时演示放在指定公共库
(3)拷贝到共享库文件夹:将链接库拷贝到制定文件夹下
cp 源文件 目标文件夹
cp /root/libme.so /lib
(4)重新加载链接库
ldconfig
详解:http://blog.163.com/cn_prince/blog/static/638790120078289157270/
此时发现主程序已经与链接库关联上了
Ps:将lib中的libme.so 文件删除,文件运行就失败了! 动态链接库不能删除,否则找不到依赖
尾声:
今天有点累,健身蹲腿累的吧!一会啃会书,洗洗睡吧!