2017-01-20 8 views
0

Я пытаюсь использовать функции из небольшой автономной библиотеки fortran из OCaml. Я могу скомпилировать библиотеку с gfortran -shared mvndst.f -o sharedlib. Вызов nm sharedlib показывает список символов, например. ... T _mvndfn_.Загрузить и использовать символы из общей библиотеки с ctypes в OCaml 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 принимает необязательный аргумент ?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" 
+0

спасибо! это кажется настолько очевидным, когда вы это знаете ... – user3240588

+0

вы можете найти необязательные аргументы в типе функции, просто набрав 'Foreign.foreign ;;' в toplevel :) –