Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OCaml生成与OCaml运行时链接的共享对象_Python_Ocaml - Fatal编程技术网

Python 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稍微违反了平台的命名约定

我正在尝试从OCaml库中构建一个共享对象,我可以使用
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