我是一名学生,正在从事一些需要使用ocaml编写代码的项目。我想用Go编写一个项目。为了了解如何从ocaml传输代码,我决定编写hello world-使用此代码的应用程序:hello.ml
:
let print_hello =
print_endline "Hello World";;
let () =
Callback.register "Hello callback" print_hello;
;;
接下来,我使用opam沙丘构建共享库(`* .so):
$ dune build hello.so
根据这个topiс,我尝试使用
cgo
从lib调用函数:main.go
:package main
/*
#cgo LDFLAGS: -ldl
#include <stdlib.h>
#include <dlfcn.h>
typedef int (*someFunc) ();
void bridge_someFunc(someFunc f) {
f();
}
*/
import "C"
import (
"unsafe"
)
func main() {
libpath := C.CString("./hello.so")
defer C.free(unsafe.Pointer(libpath))
imglib := C.dlopen(libpath, C.RTLD_LAZY)
if imglib != nil {
fHello := C.CString("Hello callback")
defer C.free(unsafe.Pointer(fHello))
fp := C.dlsym(imglib, fHello)
if fp != nil {
C.bridge_someFunc(C.someFunc(fp))
}
C.dlclose(imglib)
}
}
而且这不起作用。我究竟做错了什么?还有其他方法吗?
最佳答案
您不能只从C / Go / Rust /任何其他语言调用OCaml函数。 OCaml具有自己的数据类型和调用约定。因此,您需要编写一些glue code来将C数据结构转换为OCaml,反之亦然。这是一项不平凡且容易出错的任务,需要对OCaml有所了解并且对OCaml内部有深入的了解。有一个CTypes库,可以使用OCaml而不是C编写此粘合代码,它不易出错且更容易,但仍需要对OCaml有一定的了解。
关于c - Ocaml-> .so-> Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60771720/