C++学习笔记23:库

静态库(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);

 

转载于:https://www.cnblogs.com/hujianglang/p/6235103.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值