2017-01-20 4 views
0

OCamlの小さな自己完結型Fortranライブラリの関数を使用しようとしています。私はgfortran -shared mvndst.f -o sharedlibでライブラリをコンパイルできます。 nm sharedlibを呼び出すと、シンボルのリストが表示されます。 ... T _mvndfn_共有ライブラリのシンボルをOCamlのtoploopにctypesでロードして使用する

ctypesチュートリアルの例https://github.com/ocamllabs/ocaml-ctypes/wiki/ctypes-tutorialを読んだ後、私はlet mvndfn = foreign "mvndfn" (ptr double @-> returning float)のようなことをしようとしました。シンボルが見つかりませんでした。私はそれをどこに見ても言いませんでしたので、驚くことではないかもしれませんが、私はどのように知りません。

これはまったく動作しますか?どのように私はtoploopにこの共有ライブラリを探すように指示しますか?それはFortranではないことが重要ですか?プログラムがtoploopで動作する場合、どのようにしてプログラムをコンパイルしてリンクするのですか?

(これは、OS X上で)

答えて

5

Foreign.foreignタイプDl.libraryの値であるオプションの引数?fromを(あなたがそれを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 ;;'とタイプするだけで、オプションの引数を関数の型に見つけることができます:) –

関連する問題