另一个共享库的OCaml共享库
我正在探索一些冒险的想法 TL:DR;gnumake能够使用可加载模块,我试图使用C屏障来使用OCaml,但在OCaml运行时初始化时遇到了问题 我有以下OCaml代码:另一个共享库的OCaml共享库,c,shared-libraries,ocaml,gnu-make,C,Shared Libraries,Ocaml,Gnu Make,我正在探索一些冒险的想法 TL:DR;gnumake能够使用可加载模块,我试图使用C屏障来使用OCaml,但在OCaml运行时初始化时遇到了问题 我有以下OCaml代码: (* This is speak_ocaml.ml *) let do_speak () = print_endline "This called from OCaml!!"; flush stdout; "Some return value from OCaml" let () = Callback.reg
(* This is speak_ocaml.ml *)
let do_speak () =
print_endline "This called from OCaml!!";
flush stdout;
"Some return value from OCaml"
let () =
Callback.register "speak" do_speak
我还有一个C代码:(是的,需要使用额外的CAML
宏,但与此无关)
我的问题是只有printf(“被Make调用”)当我添加适当的load do\u speak时,code>会关闭。因此
在Makefile中,caml\u启动
不会正常运行。现在我正在调用caml\u startup
,因为如果我不这样做,我会得到一个错误
Makefile:9: dlopen(do_speak.so, 9): Symbol not found: _caml_atom_table
Referenced from: do_speak.so
Expected in: flat namespace
in do_speak.so
Makefile:9: *** do_speak.so: failed to load. Stop.
这是因为OS X上的clang进行链接的方式,有关更多详细信息,请参见此处:
我有点不知所措。。。我需要用OCaml代码创建一个C共享库,然后它需要成为另一个C共享库的一部分,我显然没有caml_startup想要的原始argv指针。正如我的代码示例所示,我尝试过假装,还使用了caml_启动(NULL)
和char**argv={NULL};caml_启动(argv)
,同样缺乏成功。我不知道如何正确初始化运行时 实际上我不太清楚你在问什么。不过,以下是对你问题这一部分的评论:
我试过假装,还使用了caml_启动(NULL)和char**argv={NULL};caml_启动(argv)也同样缺乏成功。我不知道如何正确初始化运行时
据我所知,caml_startup
的argv
参数的唯一原因是建立命令行参数(对于Sys.argv
)。如果不需要命令行参数,可以这样调用:
char *arg = NULL;
caml_startup(&arg);
char *argv[] = { "program", NULL };
caml_startup(argv);
从技术上讲,argv
应该至少包含一个字符串(程序名称)。因此,也许最好这样称呼:
char *arg = NULL;
caml_startup(&arg);
char *argv[] = { "program", NULL };
caml_startup(argv);
重点是我想使用OcAML代码作为C代码的C LIB,它打算编译成C LIB本身而不是C可执行文件,因为我现在因为这个问题放弃了OCAML并选择C++来完成这个任务,这一点也没什么关系。