感谢Jonathan Protzenko 的精彩指南,我设法在 Windows(在 Cygwin 中)上安装和运行OCaml + OPAM + utop。在utop中,我特别希望能够使用ctypes + ctypes.foreign来快速试验和原型访问各种 WinAPI 调用。从理论上讲,我成功地安装了ctypes包(成功)。不幸的是,当我尝试将它们实际加载到utop 中时,它们以令人惊讶的错误消息惨遭失败:opam install ...
utop # #require "ctypes.foreign";;
Error: Reference to undefined global `Ctypes_closure_properties'
尝试做同样的事情会rlwrap ocaml
给出一个更长的错误消息:
# #require "ctypes.foreign";;
C:\OCaml\lib\unix.cma: loaded
C:\OCaml\lib\bigarray.cma: loaded
C:\OCaml\lib\str.cma: loaded
C:\cygwin64\home\Mateusz\.opam\system\lib\bytes: added to search path
C:\cygwin64\home\Mateusz\.opam\system\lib\ctypes: added to search path
C:\cygwin64\home\Mateusz\.opam\system\lib\ctypes\ctypes.cma: loaded
C:\cygwin64\home\Mateusz\.opam\system\lib\ctypes\ctypes-foreign-base.cma: loaded
Cannot load required shared library dllctypes-foreign-base_stubs.
Reason: dllctypes-foreign-base_stubs.dll: Cannot resolve ffi_type_pointer.
C:\cygwin64\home\Mateusz\.opam\system\lib\ctypes\ctypes-foreign-unthreaded.cma: loaded
Characters -1--1:
#require "ctypes.foreign";;
Error: Reference to undefined global `Ctypes_closure_properties'
注意:会话的完整记录在此处— 它包含 cmd.exe 终端中的会话输出,以及Cygwin 终端utop
中的附加会话的输出。rlwrap ocaml
我完全不知道为什么会发生这种情况,或者我如何进一步尝试调试/查明/诊断情况,以便我可以尝试找到一些解决方法。(顺便说一下——我是 OCaml 和 OPAM 的新手,虽然我在 C/C++ 和 Linux 方面有相当的经验。)接下来是我的一些问题,我想这些问题可能有助于解决这个问题推动我通过障碍:
- 有没有办法在本地调整 git repo(即 ctypes)并将其传递给 OPAM 而不是原始的 github ?
- 我设法在谷歌上搜索了一些评论,似乎提到“libffi 的静态版本”可能会起作用,正如 ctypes 问题 #198 中所暗示的那样;但我是 OCaml 的新手,不幸的是,我完全不知道如何将这个建议应用于utop?
- 我如何告诉 OPAM 哪个 libffi 用于 ctypes?(具体来说,使用“静态 libffi”?)
- 如何检查我安装的mingw64-x86_64-libffi Cygwin 软件包是静态链接还是动态链接?或者如果提供了两种变体,那么 ctypes 使用哪一种?我在 SO 上找到了一些关于如何检测 libffi.a 是否与 PIC(?)重定位 [
-fpic
?] 相关联的答案,但它们看起来都非常骇人听闻,而且我尝试过的那些似乎都没有真正起作用,至少在我的情况下. - 任何帮助将不胜感激。我什至不知道该问谁,因为它是 OCaml、OPAM、utop 和 Cygwin 的交叉点,所有这些都是巨大且有些不相关/正交的系统。我试过在 ctypes repo 上发布这个问题,但一个月后得到的只是一个“补丁欢迎”标签。