Должна ли компиляция OCaml с пользовательской привязкой работать в Windows (через MinGW)?

Я хочу скомпилировать программу OCaml, взаимодействующую с кодом C, используя GCC на основе MinGW и используя отдельную компиляцию (GCC создает .o , затем ocamlopt производит окончательный исполняемый файл).

Мне не ясно, если (1) это должно работать на Windows, и если да, (2) какие аргументы командной строки необходимы.

Я использую OCaml Jonathan Protzenko для установки Windows для установки OCaml 4.02.1 вместе с оболочкой Cygwin (обратите внимание, что он использует собственный OCAMl-компилятор Windows, а не Cygwin-based). Я установил gcc с помощью MinGW от Nuwen (но имел ту же проблему при использовании gcc для Strawberry Perl).

Вот мой исходный код:

Файл C ( tc.c ):

 #include  #include "caml/mlvalues.h" value print(value unused) { printf("hello from C\n"); return Val_unit; } 

Файл OCaml ( t.ml ):

 external print : unit -> unit = "print" let () = Printf.printf "platform: %s\n" (Sys.os_type); print (); 

Следующие работы просто прекрасны:

 and@win7 $ ocamlopt t.ml tc.c -o t.exe and@win7 $ ./t.exe platform: Win32 hello from C 

Однако, если я использую .o вместо .c , он не работает:

 and@win7 $ gcc tc.c -c -I c:/OCaml/lib -o tc.o and@win7 $ ocamlopt t.ml tc.o -o t.exe ** Cannot resolve symbols for tc.o: puts ** Fatal error: Unsupported relocation kind 0004 for puts in tc.o File "caml_startup", line 1: Error: Error during linking 

Обе версии отлично работают в Linux.

Интересно, просто ли это глупая ошибка, которую я могу быстро исправить, предоставив правильные аргументы gcc / ocamlc / ocamlopt или если это текущее ограничение родной компиляции OCaml в Windows.

Изменить : camlspotter определил причину, поэтому в ретроспективе мне вообще не нужен MinGW от Nuwen. OCaml на Windows уже включает компилятор C на основе MinGW, за исключением того, что он называется i686-w64-mingw32-gcc а не gcc .

Вероятно, вы используете неправильный компилятор C или без соответствующих параметров. Лучший способ – использовать тот же C-компилятор +, который используется для сборки OCaml. Вы можете проверить его на ocamlc -config :

 $ ocamlc -config version: 4.02.3 standard_library_default: C:/ocamlmgw64/lib standard_library: C:/ocamlmgw64/lib standard_runtime: ocamlrun ccomp_type: cc bytecomp_c_compiler: x86_64-w64-mingw32-gcc -O -mms-bitfields -Wall -Wno-unused bytecomp_c_libraries: -lws2_32 native_c_compiler: x86_64-w64-mingw32-gcc -O -mms-bitfields -Wall -Wno-unused native_c_libraries: -lws2_32 native_pack_linker: x86_64-w64-mingw32-ld -r -o ranlib: x86_64-w64-mingw32-ranlib ... 

Например, приведенное выше показывает, что мой компилятор OCaml построен поверх 32-разрядной среды Cygwin с x86_64-w64-mingw32-gcc . То же самое относится к компоновщику и ranlib . Поскольку вы можете скомпилировать C с OCaml-кодом с ocamlopt , тот же C-компилятор должен быть уже установлен в вашей среде.

Создавать компилятор OCaml самостоятельно, чтобы убедиться, что один и тот же компилятор C используется как для C, так и для OCaml, может быть лучшим способом избежать такого несоответствия компилятора C.