2011-03-06 23 views
1

我敢肯定的愚蠢的问题是一些不正确的语法。如何让dlsym使用返回值的函数?我在下面的代码中得到错误'无效转换为void *到LSError(*)()' - 试图获得编译linux的lightscribe示例程序希望我可以将它与OSX dylib链接(为什么地狱“T HP发布实际可可SDK LS才出现了什么6或7年了):???从dlsym()返回值的函数?

void* LSHandle = dlopen("liblightscribe.1.dylib", RTLD_LOCAL|RTLD_LAZY); 
    if (LSHandle) { 
     LSError (*LS_DiscPrinter_ReleaseExclusiveUse)() = dlsym(LSHandle, "LS_DiscPrinter_ReleaseExclusiveUse"); 

.. 
lsError = LS_DiscPrinter_ReleaseExclusiveUse(pDiscPrinter); 
+1

我发现这个页面http://www.trilithium.com/johan/2004/12/problem-with-dlsym/,似乎解决了这样的问题,有必要将void *转换为函数指针。 Uugh .. – 2011-03-06 04:34:59

+0

我发现了一种工作。使用dlopen打开文件后,我有一组行: LSError(* LS_DiscPrinter_ReleaseExclusiveUse)(LS_DiscPrinterHandle); LS_DiscPrinter_ReleaseExclusiveUse =(LSError(*)(void *))dlsym(LSHandle,“LS_DiscPrinter_ReleaseExclusiveUse”); 这是相当笨拙。 xCode不喜欢在我发现的第二页上使用typedef - 我不理解为'extern“C”typedef XML_Parser parsercreate_t(const XML_Char *);'根本没有提到XML_ParserStruct的返回类型。 – 2011-03-06 06:08:57

回答

3

C标准实际上并不转换和从函数指针定义行为。解释因何而异;最常见的不是所有的体系结构都将函数指针作为简单的数据指针。在某些体系结构中,函数可能驻留在完全不同的内存段中,使用void指针无法寻址。

的“推荐使用dlsym ”方法是:

LSError (*LS_DiscPrinter_ReleaseExclusiveUse)(LS_DiscPrinterHandle); 

*(void **)&LS_DiscPrinter_ReleaseExclusiveUse = dlsym("LS_DiscPrinter_ReleaseExclusiveUse"); 

阅读dlsym的POSIX页面上的理由和例子以获取更多信息。