从dlsym()返回值的函数?

时间:2011-03-06 03:29:06

标签: objective-c c dylib weak-linking

愚蠢的问题,我确信有些语法不正确。如何让dlsym使用返回值的函数?我在以下代码中收到错误'void *无效转换为LSError(*)()' - 尝试编译linux lightscribe示例程序,希望我可以将它与OSX dylib链接(为什么地狱赢了惠普发布了一个真正的Cocoa SDK?LS现在只有6年或7年了?):

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 个答案:

答案 0 :(得分:3)

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

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

 LSError (*LS_DiscPrinter_ReleaseExclusiveUse)(LS_DiscPrinterHandle);

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

阅读dlsym的POSIX页面上的基本原理和示例,以获取更多信息。