C语言运行时调用.so库

实例:
函数介绍:
#include <dlfcn.h>

   void *dlopen(const char *filename, int flag);
   参数介绍:
   		filename 动态库路径
   		flag 标志
   			RTLD_LAZY 暂缓决定,等有需要时再解出符号 
			RTLD_NOW 立即决定,返回前解除所有未决定的符号。 
			RTLD_LOCAL 
			RTLD_GLOBAL 允许导出符号 (本库中的symbol对于后续要被加载的库是可见的)
			RTLD_GROUP 
			RTLD_WORLD 

   char *dlerror(void);

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

   int dlclose(void *handle);
#include <stdio.h>

typedef struct Module{                                                                                         
    int          version;
    int          minor_version;
    const char  *name;
    void (*init)(Module *); 
    int (*handle)(void *); 
} Module;

static int handler(void * data) {
    printf("-------- handler...\n");
    return 0;
}

static void init(Module *mod)
{
    printf("-------- init...\n");
}

Module savehtml = { 
    init,
    handler
};

编译:

gcc -shared -fPIC -o libmodule.so module.c
#include <dlfcn.h>
#include <stdio.h>

typedef struct Module{                                                                                         
    int          version;
    int          minor_version;
    const char  *name;
    void (*init)(Module *); 
    int (*handle)(void *); 
} Module;

int main(int argc, char** argv){
	void *rv = NULL;
    void *handle = NULL;
    Module *module = NULL;

	char* path = argv[1];    //动态库路径
	char* name = argv[2];    //动态库名字(不需要加上.so后缀)
	
    char * npath = strcat2(3, path, name, ".so");

    if ((handle = dlopen(npath, RTLD_GLOBAL | RTLD_NOW)) == NULL) { 
        SPIDER_LOG(SPIDER_LEVEL_ERROR, "Load module fail(dlopen): %s", dlerror());
    }   
    if ((rv = dlsym(handle, name)) == NULL) {
        SPIDER_LOG(SPIDER_LEVEL_ERROR, "Load module fail(dlsym): %s", dlerror());
    }   
    module = (Module *)rv;
    module->init(module);
    module->handler(NULL);
    dlclose(handle);
	
	return 0;
}

运行结果:

gcc -rdynamic -o main main.c -ldl
./main ./ libmodule
-------- init...
-------- handler...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行走在软件开发路上的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值