Мне удалось установить и запустить OCaml + OPAM + utop в Windows (в Cygwin) благодаря отличное руководство Джонатана Проценко. В utop я особенно хочу иметь возможность использовать ctypes + ctypes.foreign strong > для быстрого экспериментирования и создания прототипа доступа к различным вызовам WinAPI. Теоретически мне удалось успешно установить пакеты ctypes (opam install ...
успешно). К сожалению, когда я пытаюсь загрузить их в utop, они терпят неудачу с неожиданным сообщением об ошибке:
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'
Примечание. полная стенограмма сеансов находится здесь, он содержит выходные данные utop
сеанса в cmd.exe, а также дополнительный rlwrap ocaml
сеанс в терминале Cygwin.
Я понятия не имею, почему это происходит, или как я могу дальше попытаться отладить / определить / диагностировать ситуацию, чтобы я мог попытаться найти какое-то обходное решение. (И, кстати, я новичок в OCaml и OPAM, хотя у меня достаточно опыта работы с C / C ++ и Linux в целом.) Ниже приведены некоторые вопросы, которые, как я полагаю, могут помочь решить проблему в достаточной степени, чтобы протолкни меня через препятствие:
- Есть ли способ настроить репозиторий git (т.е. ctypes) локально и передать его в OPAM вместо исходного github?
- Мне удалось добавить в Google комментарий, который, кажется, упомяните, что "статическая версия libffi" может работать, что также указано в ctypes выпуск № 198; но я новичок в OCaml и, к сожалению, не имею ни малейшего представления, как применить это предложение к utop?
- Как я могу указать OPAM, какой libffi использовать для ctypes? (в частности, чтобы использовать "static libffi"?)
- Как я могу проверить, связан ли установленный мной пакет mingw64-x86_64-libffi Cygwin статически или динамически? или если предоставлены оба варианта, то какой из них используется ctypes? Я нашел несколько ответов на SO относительно того, как определить, связан ли libffi.a с перемещениями PIC (?) [
-fpic
?], Но все они казались действительно хакерскими, и ни один из тех, что я пробовал, не работал, по крайней мере, в моем кейс. - Любая помощь будет принята с благодарностью. Я даже не знаю, у кого спросить об этом, учитывая, что это пересечение OCaml, OPAM, utop и Cygwin, все это огромные и несколько несвязанные / ортогональные системы. Я пробовал опубликовать проблему в репозитории ctypes, но все это преодолело время месяца было ярлыком "приветствия патчей".
opam pin add -kgit ctypes path/to/local/repo#master
- person Daniel Bünzli   schedule 22.09.2016LIBFFI_CFLAGS
иLIBFFI_LIBS
. См. Этот файл github.com/ocamllabs/ocaml-ctypes / blob / master / src / discover / - person Daniel Bünzli   schedule 22.09.2016