当前位置:  开发笔记 > 运维 > 正文

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

如何解决《在OCamltoploop中使用ctypes加载和使用共享库中的符号》经验,为你挑选了1个好方法。

我正在尝试使用来自OCaml的一个小型自包含fortran库中的函数.我可以用它编译库gfortran -shared mvndst.f -o sharedlib.调用nm sharedlib显示符号列表,例如... T _mvndfn_.

在阅读了ctypes教程示例https://github.com/ocamllabs/ocaml-ctypes/wiki/ctypes-tutorial后,我试着做类似的事情let mvndfn = foreign "mvndfn" (ptr double @-> returning float).找不到符号.也许并不奇怪,因为我没有告诉它在哪里看 - 但我不知道如何.

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

(这是在OS X上)



1> Étienne Mill..:

Foreign.foreign获取一个可选参数?from,该参数是一个类型的值Dl.library(您可以在文档中看到它).你可以得到其中一个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 = 
# 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 = 
# let p = f Ctypes.null;;
val p : char Ctypes_static.ptr = (char*) 0x7f9d5220e64e
# Ctypes.string_from_ptr ~length:6  p;;
- : string = "1.6.26"

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有