пʼятницю, 26 грудня 2008 р.

Создание исполняемых файлов в Ocaml 3.11.0.

Появилось немного времени, решил разобраться с 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К. 

Одной проблемкой меньше.



Немає коментарів: