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

在OCaml toploop中加载并使用共享库中的符号和ctypes,ocaml,ctypes,Ocaml,Ctypes,我试图使用OCaml中一个小型自包含fortran库中的函数。我可以使用gfortran-shared mvndst.f-o sharedlib编译库。调用nm sharedlib显示符号列表,例如。。。T\u mvndfn\u 在阅读了ctypes教程示例之后,我尝试了一些类似于让mvndfn=foreign“mvndfn”(ptr double@->returning float)的操作。找不到该符号。也许并不奇怪,因为我没有告诉它去哪里看——但我不知道怎么看 这行得通吗?如何告诉toplo

我试图使用OCaml中一个小型自包含fortran库中的函数。我可以使用
gfortran-shared mvndst.f-o sharedlib
编译库。调用
nm sharedlib
显示符号列表,例如
。。。T\u mvndfn\u

在阅读了ctypes教程示例之后,我尝试了一些类似于
让mvndfn=foreign“mvndfn”(ptr double@->returning float)
的操作。找不到该符号。也许并不奇怪,因为我没有告诉它去哪里看——但我不知道怎么看

这行得通吗?如何告诉toploop查找此共享库?它是Fortran而不是C重要吗?如果一个程序在toploop中工作,我最终如何编译和链接它


(这在OS X上)

外部。外部
从中获取一个可选参数
,该参数是类型为
Dl.library
(您可以看到它)的值。您可以使用
Dl.dlopen
(动态加载是一个复杂的主题,但您通常需要
[RTLD\u 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"
#让libpng=Dl.dlopen~flags:[Dl.RTLD_LAZY]~filename:“/usr/lib/x86_64-linux-gnu/libpng16.so.16”;;
val libpng:Dl.library=
#对外开放;;
#打开Ctypes_static;;
#设f=foreign~from:libpng“png_get_libpng_ver”(ptr void@->returning(ptr char));;
val f:unit Ctypes_static.ptr->char Ctypes_static.ptr=
#设p=f Ctypes.null;;
val p:char Ctypes_static.ptr=(char*)0x7f9d5220e64e
#Ctypes.string_from_ptr~长度:6 p;;
-:string=“1.6.26”

Foreign.Foreign
中获取一个可选参数
,该参数的类型为
Dl.library
(您可以看到它)。您可以使用
Dl.dlopen
(动态加载是一个复杂的主题,但您通常需要
[RTLD\u 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"
#让libpng=Dl.dlopen~flags:[Dl.RTLD_LAZY]~filename:“/usr/lib/x86_64-linux-gnu/libpng16.so.16”;;
val libpng:Dl.library=
#对外开放;;
#打开Ctypes_static;;
#设f=foreign~from:libpng“png_get_libpng_ver”(ptr void@->returning(ptr char));;
val f:unit Ctypes_static.ptr->char Ctypes_static.ptr=
#设p=f Ctypes.null;;
val p:char Ctypes_static.ptr=(char*)0x7f9d5220e64e
#Ctypes.string_from_ptr~长度:6 p;;
-:string=“1.6.26”

只需键入
Foreign.Foreign;,即可在函数类型中找到可选参数在顶级:)您只需键入
Foreign.Foreign;,就可以在函数类型中找到可选参数在顶级中:)