在OCaml toploop中使用ctypes加载和使用共享库中的符号

时间:2017-01-20 15:06:04

标签: ocaml ctypes

我试图使用来自OCaml的一个小型自包含fortran库中的函数。我可以使用$builder = Model::where('user_id', $user_id); // returns a builder $collection = Model::where('user_id', $user_id)->get(); // returns a collection object $model = Model::where('user_id', $user_id)->first(); // returns an object 编译库。调用gfortran -shared mvndst.f -o sharedlib会显示符号列表,例如nm sharedlib

阅读ctypes教程示例https://github.com/ocamllabs/ocaml-ctypes/wiki/ctypes-tutorial后,我尝试执行... T _mvndfn_之类的操作。找不到符号。也许并不奇怪,因为我没有告诉它在哪里看 - 但我不知道如何。

这可以吗?如何告诉toploop寻找这个共享库?它的Fortran不是C,这有关系吗?如果程序在toploop中工作,我如何最终编译和链接程序?

(这是在OS X上)

1 个答案:

答案 0 :(得分:5)

Foreign.foreign使用可选参数?from,该值为Dl.library类型的值(您可以看到它in the docs)。您可以使用Dl.dlopen获得其中一个(动态加载是一个复杂的主题,但您经常需要[RTLD_LAZY])。

以下是使用libpng的示例:

# let libpng = Dl.dlopen ~flags:[Dl.RTLD_LAZY] ~filename:"/usr/lib/x86_64-linux-gnu/libpng16.so.16";;
val libpng : Dl.library = <abstr>
# open Foreign;;
# open Ctypes_static;;
# let f = foreign ~from:libpng "png_get_libpng_ver" (ptr void @-> returning (ptr char));;
val f : unit Ctypes_static.ptr -> char Ctypes_static.ptr = <fun>
# let p = f Ctypes.null;;
val p : char Ctypes_static.ptr = (char*) 0x7f9d5220e64e
# Ctypes.string_from_ptr ~length:6  p;;
- : string = "1.6.26"