一、创建共享库:
1.写源程序 xxx1.c xxx2.c.../*.c(通配符方式)
2.编译源程序,加-fpic生成.o文件
gcc -c -fpic xxx1.c xxx2.c.../*.c(通配符方式)
3.生成共享库文件
gcc -shared xxx.o -o libxxx.so
4.提供头文件,方便调用

二、使用共享库
1.写调用源程序 xxx.c
2.编译源程序,生成.o文件
3.链接共享库文件
gcc test.o -l xxx(共享库去掉lib前缀和.a后缀剩下的名字) -L . ----------{PATH}
如果操作系统支持环境变量LIBRARY_PATH,使用该环境变量可以省略-L
4.执行
执行期间,动态加载共享库,系统会自动查找LD_LIBRARY_PATH环境变量中的路径,确定共享库的位置,如果找不到
共享库文件,程序会执行失败。(静态库不需要)

三、显式加载和使用共享库
#include<dlfcn.h>
void *dlopen(const char *filename,int flag);
//filename:so文件名
//flag:打开方式
//返回值:void *,表示打开后的共享库文件指针
char *dlerror(void);
//检查dlopen打开共享库是否成功
//返回空指针表示打开成功
//返回非空字符串表示打开失败,字符串内容包含失败原因
void *dlsym(void *hanlde,const char *symbol);
//使用dlsym获取打开后的共享库中的函数
//hanlde,需要使用的共享库地址,dlopen的返回值
//symbol,需要调用的函数名
//返回值:void *,使用时需要自行转换为对应函数类型
int dlclose(void *handle);
//关闭共享库,释放内存
其中dlopen的参数flag的含义如下:
RTLD_LAZY:符号查找时候才加载。(使用时加载到内存)
RTLD_NOW:马上加载。(打开即加载到内存)

最新文章

  1. indexOf、instanceOf、typeOf、valueOf详解
  2. iOS之设置头像(访问系统相册、本地上传)
  3. Windows Azure初体验
  4. VIM使用(三)
  5. CDC 2013 北京站手记
  6. openssl c_rehash
  7. FreeMarker中List排序
  8. C++类(一)
  9. TypeScript学习笔记(四):函数
  10. jQuery慢慢啃之回调(十三)
  11. configure JDBCRealm JAAS for mysql and tomcat 7 with form based authentication--reference
  12. SCOI2015酱油记
  13. ##DAY11 UITableView编辑
  14. 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
  15. 微信小程序+和风天气完成天气预报
  16. rsyncd启动脚本
  17. vue 父子组件通信-props
  18. Django学习篇(web框架的由来)
  19. Indidual Homework Assignment
  20. [development][C] C语言标准

热门文章

  1. Linux shell脚本重试机制
  2. 树莓派-CentOS-Minimal arm版的设置
  3. DS1302时钟基础使用(含代码)
  4. C#_初识之HelloWorld
  5. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明
  6. elasticsearch 常用查询 + 删除索引 + 集群状态诊断
  7. 如何禁止谷歌浏览器隐藏url的www前缀
  8. 一篇文章带你了解SQL注入
  9. Linux系列(1):入门之基本命令详解
  10. drf的三大认证