Появилось немного времени, решил разобраться с Ocaml. Скачал новую версию для Mingw под Windows. Раньше использовал старые версии и тогда пробовал откомпилить файл в native код ничего не получалось, вылетали ошибки. Решил вернуться к этой проблеме.
Поиски в Интернете ничего толкового не дали, всё ограничиваеться только общими понятиями, типа ocamlopt -o demo.exe demo.ml.
Взял простенькую програмку с примеров и попробовал откомпилить сначала в байт код, а потом в натив код.
let rec fib n = if n < 2 then 1 else fib(n-1) + fib(n-2);;let main () =
let arg = int_of_string Sys.argv.(1) in
print_int(fib arg);
print_newline();
exit 0;;
main ();;
Хочу отметить, что после установки должна присутствовать переменная среды OCAMLLIB и в PATH должен быть прописан путь к каталогу BIN OCAML.
Первый вариант который запускаеться под ocamlrun.exe прошёл на ура. Командная строка выглядела следующим образом:
..\bin\ocamlc -o fib.exe fib.ml
Создался exe модуль небольшого размера (39К).
Попробовал откомпилить программу в нативный код используя ocamlopt. У меня установлен Mingw 3.4.5. Бат файл выглядел так:
SET PATH=E:\MingW_345\bin;%PATH%;
..\bin\ocamlopt -o %1.exe %1.ml
Получил следующие сообщение
"flexlink" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
File "caml_startup", line 1, characters 0-1:
Error: Error during linking
В файле Readme.windows.txt прочитал что необходимо для создания компилятора. В одной из строк была указана ссылка на flexdll tool(реализация dlopen-like API для Windows). Зайдя по ссылке нашёл там и flexlink. Сархива перекинул flexlink.exe в каталог bin ocaml.
После повторной компиляции ещё подкинул в каталог bin файл flexdll_mingw.o из архива.
Ещё одна попитка -- удалось создал исполняемый файл. Размер вырос и теперь составил 200к. Конечный вариант бат файла выглядит следующим образом:
SET PATH=E:\MingW_345\bin;%PATH%;
..\bin\ocamlopt -o %1.exe %1.ml -cclib -LE:\MingW_345\lib
Опция -cclib нужна для того чтобы компилятор ocaml видел библиотеки mingw.
После этого успеха (может для когото это уже пройденный этам) попробовал создать самодостаточный исполняемый модуль используя ocamlc (компилятор в байткод). Немного повозившись удалось собрать exe модуль на байт коде используя mingw. Бат файл выглядит так
SET PATH=E:\MingW_345\bin;%PATH%;
..\bin\ocamlc -o %1.exe %1.ml -custom -cclib -LE:\MingW_345\lib
Размер файла немного больше нативного 223К.
Одной проблемкой меньше.