我有一个头文件,它为某个库声明了一个C API,我想为这个库创建一个OCaml绑定。我发现camlidl可以从IDL文件创建存根,但据我所知,没有从*.h
文件到IDL的自动转换,所以现在我想知道是否还有其他方法可以从C生成OCaml绑定的存根头文件?
答案 0 :(得分:6)
C头文件中没有足够的信息来编写另一种语言的绑定。在非常简单的情况下(例如,所有函数只接受整数或浮点参数),这是可能的,但只要涉及指针,就需要提供更多信息:函数是否会从指向的值读取,写入对它,或两者兼而有之?接口是否必须允许空指针?这实际上是一个指向数组的指针,大小在哪里?这是char*
指向以零结尾的字符串的指针吗?
IDL使用额外注释扩展C函数声明以涵盖所有这些点。这就是camlidl
在IDL上工作而不是直接在C头上工作的原因。你不会发现任何明显不那么痛苦的事情。
还有另一种方法,即使用具有空扩展但提供额外类型信息的宏来自由地注释C头,例如。
int memmove(void ANN_OUT ANN_SIZE(n) ANN_NOT_NULL *dest,
const void ANN_IN ANN_SIZE(n) ANN_NOT_NULL *src,
size_t n);
这样的注释不是标准化的,所以如果你走这条路,你将不得不编写自己的工具。 (如果要解析C,请查找Cil。)我建议您将IDL声明视为主要声明,并从中生成C头文件。
答案 1 :(得分:0)
Swig会有帮助吗?