Python OCaml生成与OCaml运行时链接的共享对象
我正在尝试从OCaml库中构建一个共享对象,我可以使用Python OCaml生成与OCaml运行时链接的共享对象,python,ocaml,Python,Ocaml,我正在尝试从OCaml库中构建一个共享对象,我可以使用ctypes中的cdll接口在Python下运行该库 是否有一种方法可以引导OCaml工具链中的某些内容生成一个共享对象,并将其依赖项链接到其中 我开始怀疑OCaml根本不支持我正在尝试做的事情。我想调用一个OCaml函数,但让它产生某种结果,并将控制返回到调用它的位置 这是我的OCaml库 (* foo.ml *) let add x y = x + y 我用来在OS X上编译它的命令(使用.so而不是.dylib稍微违反了平台的命名约定
ctypes
中的cdll
接口在Python
下运行该库
是否有一种方法可以引导OCaml工具链中的某些内容生成一个共享对象,并将其依赖项链接到其中
我开始怀疑OCaml根本不支持我正在尝试做的事情。我想调用一个OCaml函数,但让它产生某种结果,并将控制返回到调用它的位置
这是我的OCaml库
(* foo.ml *)
let add x y = x + y
我用来在OS X上编译它的命令(使用.so
而不是.dylib
稍微违反了平台的命名约定,但是ocamlopt
只接受.o
或的扩展名,所以)
成功并生成foo.so
$ ocamlopt -output-obj -fPIC -o foo.so foo.ml
这是我第一次尝试将共享对象加载到python程序(python 3.6)中
它在运行时产生以下错误
摘录:
self._handle = _dlopen(self._name, mode)
OSError: dlopen(./foo.so, 6): Symbol not found: _caml_code_area_end
完全错误:
Traceback (most recent call last):
File "foo.py", line 3, in <module>
lib = ctypes.cdll.LoadLibrary('./foo.so')
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ctypes/__init__.py", line 426, in LoadLibrary
return self._dlltype(name)
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ctypes/__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(./foo.so, 6): Symbol not found: _caml_code_area_end
Referenced from: ./foo.so
Expected in: flat namespace
in ./foo.so
并尝试加载/usr/local/lib/ocaml/libasmrun\u shared
import ctypes
lib = ctypes.cdll.LoadLibrary('/usr/local/lib/ocaml/libasmrun_shared.so')
lib = ctypes.cdll.LoadLibrary('./foo.so')
print("Loaded")
产生错误的原因:
OSError: dlopen(/usr/local/lib/ocaml/libasmrun_shared.so, 6): Symbol not found: _caml_apply2
Referenced from: /usr/local/lib/ocaml/libasmrun_shared.so
Expected in: flat namespace
in /usr/local/lib/ocaml/libasmrun_shared.so
\u caml\u apply2
符号位于OCaml运行时的深处,我无法找到具有扩展名的文件。。。而且cdll
似乎没有公开加载.a
s的功能。出于某种原因,-fPIC
标志是不够的,您还需要一个PIC运行时。以前,这需要一个特殊的开关(例如4.04.1+fPIC
),但现在您可以选择要链接的运行时
以下内容适用于我(Debian buster,opam 4.06.1+rc2开关):
我正在尝试从OCaml库中构建一个共享对象,我可以使用ctypes中的cdll接口在Python下运行该库
请注意,您不能仅从Python(或其他接口)调用OCaml符号,您需要编写一些C来设置运行时并管理OCaml对象。一个简单的方法是用于此部件。出于某种原因,-fPIC
标志是不够的,您还需要一个PIC运行时。以前,这需要一个特殊的开关(例如4.04.1+fPIC
),但现在您可以选择要链接的运行时
以下内容适用于我(Debian buster,opam 4.06.1+rc2开关):
我正在尝试从OCaml库中构建一个共享对象,我可以使用ctypes中的cdll接口在Python下运行该库
请注意,您不能仅从Python(或其他接口)调用OCaml符号,您需要编写一些C来设置运行时并管理OCaml对象。一个简单的方法是用于此部件
import ctypes
lib = ctypes.cdll.LoadLibrary('/usr/local/lib/ocaml/libasmrun_shared.so')
lib = ctypes.cdll.LoadLibrary('./foo.so')
print("Loaded")
OSError: dlopen(/usr/local/lib/ocaml/libasmrun_shared.so, 6): Symbol not found: _caml_apply2
Referenced from: /usr/local/lib/ocaml/libasmrun_shared.so
Expected in: flat namespace
in /usr/local/lib/ocaml/libasmrun_shared.so
% ocamlopt -output-obj -runtime-variant _pic -o foo.so foo.ml
% python foo.py
Loaded