2017-01-20 71 views
0

我試圖使用來自OCaml的小型自包含Fortran庫中的函數。我可以用gfortran -shared mvndst.f -o sharedlib編譯庫。調用nm sharedlib顯示符號的列表,例如... T _mvndfn_在OCaml中加載和使用共享庫中的ctypes中的符號toploop

在閱讀ctypes教程示例https://github.com/ocamllabs/ocaml-ctypes/wiki/ctypes-tutorial後,我試着做一些類似let mvndfn = foreign "mvndfn" (ptr double @-> returning float)的事情。該符號未找到。也許並不奇怪,因爲我沒有告訴它在哪裏看 - 但我不知道如何。

這可以工作嗎?如何告訴toploop尋找這個共享庫?它是Fortran而不是C是否重要?如果程序在toploop中運行,我如何最終編譯和鏈接程序?

(這是在OS X)

回答

5

Foreign.foreign有一個可選的參數?fromDl.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" 
+0

的感謝!它看起來很明顯,當你知道它... – user3240588

+0

只需在頂級鍵入'Foreign.foreign ;;',你就可以在函數的類型中找到可選參數:) –

相關問題