linux.调用so
#include <dlfcn.h>
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 返回错误
译
1.什么是动态库?(共享库)
动态库是可以执行,静态库不能执行
但动态库没有main,不能独立执行。
动态库不会连接成程序的一部分。
程序执行的时候,必须需要动态库文件。
2.工具
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.静态库本质:
就是目标文件集合(归档)
6.-static可选
2.库的规范与约定
库命名规则:
lib库名.a.主版本号.副版本号.批号
lib库名.a
库使用规则
-l 库名
-L 库所在目录
我们在写c语言的时候,经常会去包含一个.h的头文件,这个头文件就是库文件,比如<stdio.h>,<stdlib.h>这些都是标准的头文件,一般放在/usr/include,也就是说,从这个目录中我们可以找到这个头文件,然后调用它的库里面的方法,当然这些库是gcc帮助我们自动链接的,那么这里就延伸出了一个问题,不在标准库里面的头文件,我们怎么引用,也就是我们自己的头文件怎么引用?,
介绍头文件的用法
什么是静态库与动态库
静态库与动态库的制作方法
静态库的制作
静态库的使用
主函数c文件 -l库名 -L 路径 -o 可执行文件名
-l是要指定要用的静态库
-L告诉gcc编译器从-L指定的路径去找静态库,默认从 /usr/lib 或 /usr/local/lib 路径下去找。
动态库的制作
动态库的使用
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "add.h"
4
5
6 int main()
7 {
8 int res = add(1,2);
9 printf("%d\n",res);
10 return 0;
11 }
ldd->可以查看可执行文件的可依赖的库文件