1、简单的说,前面的动态库的制作和使用一节中,在加载时需要动态加载的资源在执行时被全部加载,而动态加载说的就是加载时按需加载。需要使用以下函数:
dlopen(3) #参数3代表库函数,2代表系统调用,1代表命令。可以使用man 3 dlopen查看此函数的帮助,使用需要包含头文件 #include<dlfcn.h>
void *dlopen(const char *filename,int flag);
功能:加载一个动态库文件
参数:
filename:
指定要加载的动态库的文件名称
flag:
RTLD_LAZY:暂缓决定,等有需要时再解出符号
RTLD_NOW:立即决定,返回前解决所有未决定的符号
返回值:
NULL:失败
dlclose(3)
void *dlclose(void *handle)
功能:
将handle指定的动态库引用计数减1。当计数值为0或没有引用时对应的动态库将被unloaded
参数:
handle:dlopen(3)的返回值
返回值:
非0:错误
0:成功
char *dlerror(void);
功能:
获取最近调用dlopen,dlclose,dlsym所产生的错误信息
参数:
void
返回值:
非空:错误信息
NULL:无错误信息
void *dlsym(void *handle,const char *symbol);
功能:
返回有handle指定的动态库里的由symbol所指定加载到内存的地址。
参数:
handle:dlopen(3)的返回值
symbol:指定函数的名字
返回值:
NULL:在handle指定的动态库中找不到symbol所指定的内容
非空:加载到内存的地址
举例:见PC的嵌入式练习文件夹
另外需要注意的是,在链接时需要将上述函数所包含的动态库进行链接,否则无法使用上述函数。即-ldl
网友评论