目录
1. 库的定义和分类
-
概念
-
动态库:
- Linux上称为:共享对象库; 文件后缀 .so
- windows 动态加载函数; 文件后缀 .dll
-
静态库:
- 在程序执行之前 就加入到 目标程序中去了;
-
-
库文件位置
- GNU标准建议所有的函数库文件都放在/usr/local/lib目录下,
- 而且建议命令可执行程序都放在/usr/local/bin目录下
具体的位置信息: /etc/ld.so.conf
库环境变量:LD_LIBRARY_PATH
2. 静态库 & 动态库 创建
2.1. 静态库
源文件 ==> 可执行文件:预编译、编译、汇编、链接;
- 编译
gcc -O -c c文件 gcc -O -c pr1.c pr2.c
- 链接静态库
ar -rsv libpr.a pr1.o pr2.o libpr.a:库文件名;
- 编译链接
//使用 main.c 进行编译; gcc -o main main.c -L./ -lpr ./main
2.2. 动态库的创建
2.2.1. 动态库的创建步骤
- 需要有头文件和源文件
- 生成动态库
gcc -fPIC -shared -o lib动态库名.so xxx.c PIC:位置无关的代码 gcc -shared -fPIC -o libfunction.so function.c
- 链接动态库
gcc main.c -L. -l动态库名 gcc test.c -o test -L/home/zxin10/van/ -lfunction
- 使用动态库
使用动态库: 系统默认缺省路径: /lib64/ /usr/lib64/ 配置一下环境变量 export LD_LIBRARY_PATH=.
2.2.2. 动态库的动态加载
采用dlopen、dlsym、dlclose加载动态链接库
-
dlopen
-
dlsym
-
dlclose
2.2.3. C++ 动态库的创建
//简单示例
- 编译
g++ -shared -fPIC -o libfun.so fun.cpp
- 链接
g++ test.cpp -o test3 -L. -llibfun
2.3. 动态库的交叉调用
2.3.1. C调用C++库
- 需要修改动态库的头文件,保证兼容性
//修改动态库的头文件function.h #ifndef COMM_FUNC_H_ #define COMM_FUNC_H_ #ifdef __cplusplus extern "C" { #endif int add(int a, int b); #ifdef __cplusplus } #endif #endif
3. 动态库常用命令
- nm
- LDD
- READELF