dlopen 用于不同的库? C
dlopen for different libraries? C
你好,我正在开发一个这样工作的程序:
./Filters File [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));
但是当我尝试编译时出现这个错误:error: too many arguments to function ‘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);
并且您将使用它来声明函数指针(有一些 "direct" 方法可以在 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));
(大多数 printf
格式字符串最好以 \n
结尾;否则调用 fflush(3) 因为 stdout
通常是行缓冲的)
顺便说一句,你的问题主要是关于理解函数指针(如果函数指针是通过 dlsym
以外的其他方式获得的,例如使用一些 JIT compiling library like GCCJIT)。
你好,我正在开发一个这样工作的程序:
./Filters File [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));
但是当我尝试编译时出现这个错误:error: too many arguments to function ‘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);
并且您将使用它来声明函数指针(有一些 "direct" 方法可以在 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));
(大多数 printf
格式字符串最好以 \n
结尾;否则调用 fflush(3) 因为 stdout
通常是行缓冲的)
顺便说一句,你的问题主要是关于理解函数指针(如果函数指针是通过 dlsym
以外的其他方式获得的,例如使用一些 JIT compiling library like GCCJIT)。