c - Ocaml-> .so-> Golang

标签 c go ocaml .so

我是一名学生,正在从事一些需要使用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/

相关文章:

戈兰戈尔姆 : Is it possible to delete a record via a many2many relationship?

go - 如何递归地将字符串连接到golang中的字符串类型数组

sockets - App Engine 开发服务器 - 套接字协议(protocol)类型错误

types - 输入模块 Printf

c++ - UDP WinSock - 未接收广播数据包

C in 2048,移动问题

c - "IP_TRANSPARENT"未在此范围内声明

c - 请使用 fork() 帮助解释此 C/linux 代码

ocaml - OCaml 中的空字符

ocaml - find_first 函数如何用于 OCaml 集?