静态库(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);
时间: 2024-10-08 07:03:23