Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
另一个共享库的OCaml共享库_C_Shared Libraries_Ocaml_Gnu Make - Fatal编程技术网

另一个共享库的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

我正在探索一些冒险的想法

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.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++来完成这个任务,这一点也没什么关系。