Ocaml/C使用bigarray进行互操作:“未定义符号:caml_ba_alloc”

Ocaml/C使用bigarray进行互操作:“未定义符号:caml_ba_alloc”,c,ocaml,C,Ocaml,我正在尝试编译一个使用bigarray的“Hello World”级Ocaml/C互操作程序。我得到一个关于未定义符号的错误:caml_ba_alloc详细信息如下。它似乎应该由bigarray.h提供 这是我的档案: wrap_mylib.c: 包括 包括 包括 CAMLprim值caml_Fnx值{ float*result=mallocsizeoffloat; 长dims[]={1,1}; 返回caml_ba_allocaml_ba_NATIVE_INT,2,结果,dims; } myli

我正在尝试编译一个使用bigarray的“Hello World”级Ocaml/C互操作程序。我得到一个关于未定义符号的错误:caml_ba_alloc详细信息如下。它似乎应该由bigarray.h提供

这是我的档案:

wrap_mylib.c:

包括 包括 包括 CAMLprim值caml_Fnx值{ float*result=mallocsizeoffloat; 长dims[]={1,1}; 返回caml_ba_allocaml_ba_NATIVE_INT,2,结果,dims; } mylib.ml:

外部ext\u caml\u fn:int->float,Bigarray.float32\u elt,Bigarray.c\u布局Bigarray.Array2.t =caml_fn;; 生成文件:

环境

操作系统:Ubuntu 18.04.2 LTS仿生海狸

$ ocaml --version
The OCaml toplevel, version 4.05.0
谢谢大家!

像bigarray.h这样的文件定义了编译时有用的东西。但您的问题是链接时间问题。您需要找到包含正在查找的函数的库,并将其包含在链接步骤中

如果我使用ocamlopt本机代码实现,并使用普通的对象文件OCaml.cmx和C.o而不是共享库,那么我可以像下面这样进行链接:

$ ocamlopt -c mylib.ml
$ gcc -I $(ocamlc -where) -c wrap_mylib.c
$ ocamlopt -o mylib_test wrap_mylib.o mylib.cmx
这将生成一个可执行的mylib_测试,我可以运行该测试:

$ ./mylib_test
$
当然,运行可执行文件时不会发生任何事情,因为文件mylib.ml中没有顶级代码。所以这只是测试事情是否会联系起来

我希望这会有所帮助。

像bigarray.h这样的文件定义了在编译时有用的东西。但您的问题是链接时间问题。您需要找到包含正在查找的函数的库,并将其包含在链接步骤中

如果我使用ocamlopt本机代码实现,并使用普通的对象文件OCaml.cmx和C.o而不是共享库,那么我可以像下面这样进行链接:

$ ocamlopt -c mylib.ml
$ gcc -I $(ocamlc -where) -c wrap_mylib.c
$ ocamlopt -o mylib_test wrap_mylib.o mylib.cmx
这将生成一个可执行的mylib_测试,我可以运行该测试:

$ ./mylib_test
$
当然,运行可执行文件时不会发生任何事情,因为文件mylib.ml中没有顶级代码。所以这只是测试事情是否会联系起来


我希望这会有帮助。

回答我自己的问题。下面是我如何让它工作的。通过链接bigarray.cma编译mylib_测试:

然后运行以下命令:

LD_LIBRARY_PATH=. ./mylib_test
LD_库_路径=。它必须在同一目录中找到另一个_wrapper.so的共享库


据了解,bigarray现在是标准库的一部分,因此只有在使用旧版兼容性库时才需要链接bigarray.cma。可能我的标准库版本很旧。

回答了我自己的问题。下面是我如何让它工作的。通过链接bigarray.cma编译mylib_测试:

然后运行以下命令:

LD_LIBRARY_PATH=. ./mylib_test
LD_库_路径=。它必须在同一目录中找到另一个_wrapper.so的共享库


据了解,bigarray现在是标准库的一部分,因此只有在使用旧版兼容性库时才需要链接bigarray.cma。可能我的标准库版本很旧。

非常有用!此外,您关于需要查找包含必要函数的库的说明导致我找到了使用ocamlc解决此问题的方法。为了完整起见,我在一个单独的答案中添加了它,但是您的解决方案更简单,并且是我计划在我的项目中使用的解决方案。非常有用!此外,您关于需要查找包含必要函数的库的说明导致我找到了使用ocamlc解决此问题的方法。为了完整起见,我在一个单独的答案中添加了它,但是您的解决方案更简单,并且是我计划在我的项目中使用的解决方案。