gpt4 book ai didi

c - dlopen 适用于不同的库? C

转载 作者:行者123 更新时间:2023-11-30 19:12:06 29 4
gpt4 key购买 nike

嗨,我正在开发一个程序,其工作原理如下:

./Filters 文件 [过滤器...]

过滤器可以是很多我想自己创建并将它们应用到文件的 .so 库。但所有库都有相同的函数 process(a1,a2,a3),只是每个库执行的操作不同。

我尝试像这样使用它:

/*Open the library*/
if (!(descriptor_lib=dlopen(dir_filter, RTLD_LAZY))) {
fprintf(stderr, MYNAME": %s\n", dlerror());
return(1);
}

/*We find the function we want to use*/
if (!(fn=dlsym(descriptor_bib, "process"))) {
fprintf(stderr, MYNAME": %s\n", dlerror());
return(1);
}

/*And then I try to use the function*/
printf("Number of chars readed: %d", fn(a1, a2, a3));

但是当我尝试编译时出现此错误:错误:函数“fn”的参数太多

dir_filter 是库的方向,但它是一个变量,导致我创建一个循环来读取所有过滤器,将实际的过滤器复制到 dir_filter 中,然后使用上面的代码。

而且我认为,如果我用库的名称指定 dir_filter ,它将起作用,但我不能这样做,因为我需要使其适用于不同的过滤器(不同的库) ),它不会总是一样的。现在我只有 3 个库,但如果将来我想扩展它,我不想每次添加新库时都扩展代码。

那么我做错了什么,或者不可能使用带有变量的 dlopen ?

编辑:函数过程是这样的:

int process(char*buff_in, char*buff_out, int tam)

EDIT2:使用 typedef 我可以修复函数指针,这就是问题所在。感谢您的回复,抱歉我的英语不好。

最佳答案

假设您的 process 函数(在您的插件代码中)声明为

int process(int, int, int);

那么,你最好define其签名的 typedef (在执行 dlsym 的主程序内):

typedef int process_sig_t (int, int, int); 

你将使用它来声明函数指针(有一些“直接”方法可以在 C 中声明函数 pointer 而不使用 typedef 作为其签名,但我发现它们可读性较差)。

process_sig_t *fnptr = NULL;

然后编译器就会知道该指针引用的函数的签名。

(将 fnptr 初始化为 NULL 可以省略;它使代码更具可读性且不易出错,因为具有更可重现的行为)

您可以使用dlsym来填充,例如

if (!(fnptr=dlsym(descriptor_bib, "process"))) {
fprintf(stderr, MYNAME": %s\n", dlerror());
return(1);
}

使用它

printf("Number of chars read: %d\n", (*fnptr) (a1, a2, a3));

顺便说一句,函数指针可以直接调用:

// less readable code, we don't know that fnptr is a function pointer
printf("Number of chars read: %d\n", fnptr (a1, a2, a3));

(最好以 \n 结束大多数 printf 格式字符串;否则调用 fflush(3) 因为 stdout 通常是行缓冲)

顺便说一句,您的问题主要是关于理解函数指针(如果函数指针是通过 dlsym 之外的其他方式获得的,例如使用一些 JIT compiling 库,如 GCCJIT )。

关于c - dlopen 适用于不同的库? C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37900940/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com