3.17 开发一个插件

打开动态链接库

• void *dlopen (const char *filename, int flag);
返回一个操作句柄void *Handle = dlopen (“./libct.so”, RTLD_LAZY);
• RTLD_LAZY:解析动态库遇到未定义符号不退出,仍继续使用
• RTLD_NOW:遇到未定义符号,立即退出
• RTLD_GLOBAL:允许导出符号,后面其它的动态库中可以引用

取动态对象地址

• void *dlsym (void *handle, char *symbol);

根据动态链接库句柄和符号,返回符号对应的地址
一般要定义一个符号类型的指针,保存该符号对应的地址
• void (* funcp) (int , int);
• funcp = (void(*)(int, int )) dlsym(Handle , “myfunc”);

关闭动态链接库

• int dlclose (void *Handle);
该函数将共享库引用计数减一,当引用计数为0时,该共享库
将会从系统中卸载

动态库错误函数

• const chat *dlerror (void);
当动态链接库操作函数失败,dlerror将返回出错信息;没有出
错,则返回值为NULL
系统调用头文件:#include<dlfcn.h>


/* C file */
/************************************************
* Copyright(C) zhaixue.cc. All rights reserved
*
*      Filename: main.c
*        Author: litao.wang
*        E-mail: 3284757626@qq.com
*   Description: 
*        Create: 2017-09-21 06:59:57
* Last Modified: 2017-09-21 07:00:08
************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<dlfcn.h>

typedef int (*cac_func)(int ,int);

int main(void)
{
	void *handle;
	char *error;
	cac_func fp = NULL;

	handle = dlopen("./libct.so",RTLD_LAZY);
	if(!handle)
	{
		fprintf(stderr, "%s\n", dlerror());
		exit(EXIT_FAILURE);
	}

	dlerror();

	fp = dlsym(handle, "add");
	if((error = dlerror()) !=NULL)
	{
		fprintf(stderr, "%s\n",error);
		exit(EXIT_FAILURE);
	}

	printf("add:%d\n",fp(8,2));

	fp = (cac_func)dlsym(handle,"sub");
	printf("sub:%d\n",fp(8,2));

	fp = (cac_func)dlsym(handle,"mul");
	printf("mul:%d\n",fp(8,2));

	fp = (cac_func)dlsym(handle,"div");
	printf("div:%d\n",fp(8,2));


	dlclose(handle);
	exit(EXIT_SUCCESS);
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页