linux.调用dll & .so库引用

main()
{
void handle=dlopen("./libdemo4.so",RTLD_LAZY);
void(
fun)(int)=dlsym(handle,"diamond");
fun(5);
dlclose(handle);}

使用libdl.so库
动态库加载的原理

动态库中函数的查找已经封装成库libdl.so
dlopen 打开一个动态库
dlsym 在打开动态库找一个函数
dlclose 关闭动态库
//dlerror 返回错误

注意了
动态库是可以执行,静态库不能执行
但动态库没有main,不能独立执行。
动态库不会连接成程序的一部分。
程序执行的时候,必须需要动态库文件。

ldd  察看程序需要调用的动态库
 ldd 只能察看可执行文件.
 readelf -h 察看执行程序头.
 nm   察看库中的函数符号

3.动态库的编译
3.1.编译
-c -fpic(可选)
3.2.连接
-shared
4.使用动态库
gcc 代码 动态库文件名
gcc 代码 -l库名 -L动态库所在路径

标准命名规则:
lib库名.so
lib库名.a

 -l 库名  -L 库所在路径

大深坑:
4.1.执行程序怎么加载动态库?
4.2.动态库没有作为执行程序的一部分,为什么连接需要指定动态库以及目录?
连接器需要确定函数在动态库的中的位置

动态库的加载:
1.找到动态库
2.加载动态库到内存
3.映射到用户的内存空间
系统对动态库查找规则:
/lib
/usr/lib
到环境变量LD_LIBRARY_PATH指定的路径中查找

三.静态库的编译
1.编译过程(*.a achieve)
1.1.编译成目标文件
-static 可选
gcc -c -static 代码文件.c

1.2.归档成静态库
ar工具
ar -r
-t
ar -r 静态库文件 被归档的文件

 nm工具(察看函数符号表)
  nm 静态库或者动态库或者目标文件或者执行文件

1.3.使用静态库
gcc 代码 静态库

结晶步骤:

1.函数等代码封装的二进制已经编译的归档文件

2.ar归档方式 库的方式

3.编译好的程序运行的时候不依赖库。库作为程序的一部分编译连接。

4.文件集合(归档)

5.库命名规则 注意了:
lib库名.a.主版本号.副版本号.批号
lib库名.a
库使用规则
-l 库名
-L 库所在目录

你可能感兴趣的:(linux.调用dll & .so库引用)