我正在尝试包装一个使用回调的C库,它们需要不同的调用约定,具体取决于操作系统。
在Windows上,他们需要stdcall
(如果是x64,则为C
)。在Linux和macOS上,它们必须是C
。
我使用bindgen生成绑定,但我也希望将该层包装在隐藏回调的另一层中。我认为以下内容应该有效:
extern "system" .........
但是我遇到了这些错误(目前在macOS上):
E0308: mismatched types
label: expected "C" fn, found "system" fn
note: expected type `extern "C" fn(*mut ...
我想分享所有平台的包装层。我是否需要复制包装层或使用宏? extern "system"
应该有效吗?这是一个错误吗?
编辑:
我最后写了一个解决方法:https://crates.io/crates/extern_attrib