静态库(Archives)

  • 后缀一般为“*.a”
  • 使用两个目标文件创建单一静态库的编译与链接命令:ar cr libtest.a  test1.o test2.o
  • 链接器搜索静态库时,链接所有已引用而未处理的符号
  • 将静态库的链接放置在命令行尾部,确保其引用被正确解析

动态库(Shared Object)

  • 共享目标库(类似windows的DLL),后缀一般为“*.so”
  • 编译命令:g++ -shared - fPIC -o libtest.so test1.o test2.o
  • PIC:位置无关代码(Position - Independent Code)
  • 编译器首先链接动态库,其次才是静态库
  • 如果要强制链接静态库,编译使用-static选项

标准库与库相关性

C标准库:libc

数学库单独:libm;需要调用数学函数时,显式链接数学库:g++ -o compute compute.c -lm

C++标准库:libstdc++

编译C++11程序,使用g++ -4.8 -std=c++11 ;对于Code::Blocks等集成开发环境,在编译器设置对话框中选用C++11选项

库的相关性

  • 链接时需要注意交叉引用被正确解析,例如:libtiff库需要libjpeg库(jpeg图像处理)和libz库(压缩处理)
  • 独立库链接:g++ -static -o tifftest tifftest.c -ltiff -ljpeg -lz
  • 相关库链接:g++ -o app app.o -la -lb -la(库之间交叉相关)

动态库的装载与卸载

动态库装载dlopen():头文件:“dlfcn.h”

函数查找与装载函数dlsym()

动态库卸载函数:dlclose()

动态库错误处理函数dlerror()

调用动态库中的函数,设函数名为g

混合c/c++编码时,c函数应该封装extern "C"{...}块中,确保名解析正确工作(c不支持函数重载)

链接选项:“-ldl”

void *handle = dlopen("libtest.so",RTLD_LAZY);

//声明函数指针指向动态库中的函数,按被调函数的名称查找

void (*test)() = dlsym(handle,"g");

(*test)();//使用函数指针调用动态库中的函数

dlclose(handle);

最新文章

  1. php mysqli mysqli_query() mysqli_real_query()
  2. .net实现webservice简单实例分享
  3. Map 映射
  4. BZOJ 3144 切糕(最小割)
  5. 【重走Android之路】【路线篇(二)】知识点归纳
  6. (转)beanUtil接口和类(有空的时候去看,到时候删除这个说明)
  7. (菜鸟要飞系列)一,基于Asp.Net MVC5的后台管理系统(前言)
  8. linux下C++ STL hash_map的使用以及使用char *型变量作为Key值的一大“坑”
  9. nodejs iconfont处理
  10. 关于javascript面向对象之闭包
  11. linux查看端口和进程
  12. 改变Edit的光标(使用CreateCaret,ShowCaret和LoadBitmap三个API函数)
  13. 201521123081《Java程序设计》 第8周学习总结
  14. linux查看tomcat启动运行日志
  15. 回溯法 17. Letter Combinations of a Phone Number
  16. Idea实用配置
  17. 集合类(常见的集合类:Collection、List、Set、ArrayList、linkedList、Vector、HashSet、TreeSet)
  18. IIS站点工作原理与ASP.NET工作原理
  19. Spring Security(一)
  20. 转:zookeeper中Watcher和Notifications

热门文章

  1. R绘图基础
  2. mac 终端 svn 命令(转)
  3. VS2010/2012配置优化记录笔记
  4. CentOS6.5 mysql 5.5安装
  5. Shiro Security
  6. struts(二) ---中参数传值
  7. Beautiful 疑问小记
  8. Excle隐藏及展开列
  9. C++ 高质量编程附录试题
  10. 导出Excel 有身份证时注意