2016-06-18 33 views
-1

你好我的工作是工作原理是这样的程序:dlopen不同的图书馆? ç

./Filters File [filters...]

过滤器可以有很多,我想创建自己和他们APLY到文件的.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我可以解决的函数指针,这就是问题所在。感谢您的回复,并对我的英语感到抱歉。

+4

显示'fn'及其所有相关类型的声明。所以**编辑你的问题来改善它**。您可能想要使用'typedef'来签名,请参阅[this](http://stackoverflow.com/a/9143434/841108) –

+1

问题不在于过程函数的类型,而在于函数的类型在更新后仍然不显示的指针。 –

+0

编译器如何知道传递给'fn'的类型? –

回答

1

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

int process(int, int, int); 

然后,你会更好define一个typedef其签名(主程序中做dlsym):

typedef int process_sig_t (int, int, int); 

你会用它来声明函数指针(有一些“直接”的方法来声明函数pointer而不使用typedef为其签名,但我觉得他们不太可读)。

process_sig_t *fnptr = NULL; 

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

(的fnptrNULL初始化可被省略,它使得代码更易读且不易出错,因为具有更可再现的行为)

你将填补使用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)); 

BTW,函数指针可以直接调用:

// 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库,如GCCJIT)。

+0

嘿,非常感谢你的具体。我可以解决这个问题。顺便说一下,我在主帖子中更新了函数'process'的格式。 – DavidCG

+0

如果合适,您可以接受或提出我的答案。 –