gpt4 book ai didi

objective-c - 从 dlsym() 返回值的函数?

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:36 28 4
gpt4 key购买 nike

愚蠢的问题,我敢肯定是一些不正确的语法。如何让 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);

最佳答案

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

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

 LSError (*LS_DiscPrinter_ReleaseExclusiveUse)(LS_DiscPrinterHandle);

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

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

关于objective-c - 从 dlsym() 返回值的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5208476/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com