1

我敢肯定,愚蠢的问题是一些不正确的语法。如何让 dlsym 使用返回值的函数?我在以下代码中收到错误“void* 到 LSError (*)() 的无效转换” - 试图编译 linux lightscribe 示例程序,希望我可以将它与 OSX dylib 链接起来(为什么地狱赢了'HP 没有发布实际的 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);
4

1 回答 1

3

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

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

 LSError (*LS_DiscPrinter_ReleaseExclusiveUse)(LS_DiscPrinterHandle);

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

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

于 2011-03-06T20:43:00.520 回答