2013-06-26 42 views
9

Tôi muốn biên dịch một số bytecode OCaml và nó chạy trên các hệ thống kiểu Windows và Unix. Mã nguồn của tôi hoạt động tốt nếu tôi biên dịch lại nó trên mỗi nền tảng, nhưng mã byte không phải là di động.Làm thế nào để làm cho bytecode OCaml hoạt động trên Windows và Linux

Mẫu mã: lệnh

open Unix 

let on_windows = Filename.dir_sep <> "/";; 
Printf.printf "On windows: %b\n" on_windows;; 

let child = create_process "gpg" (Array.of_list ["gpg"; "--version"]) stdin stdout stderr;; 
Printf.printf "Child %d\n" child;; 

tích xây dựng:

ocamlbuild -use-ocamlfind -pkg unix test.byte 

Nếu tôi biên dịch trên Windows và chạy trên Linux, tôi nhận được

Fatal error: unknown C primitive `win_waitpid' 

Nếu tôi biên dịch trên Linux và chạy trên Windows tôi nhận được:

Fatal error: unknown C primitive `unix_waitpid' 

Tôi làm cách nào để mã byte hoạt động ở mọi nơi?

+0

Vui lòng hiển thị lệnh biên dịch. – ygrek

+0

Tôi đang sử dụng ocamlbuild - Tôi đã chỉnh sửa câu hỏi. –

Trả lời

2

Chỉ đổi tên các ký hiệu C không hoạt động vì có hai phiên bản hoàn toàn khác nhau của mô-đun unix.ml (mặc dù có cùng giao diện). Nếu bạn liên kết mã của mình một cách tĩnh, bạn sẽ nhận được mã cho nền tảng xây dựng và nó sẽ không hoạt động trên nền tảng khác.

Giải pháp là tạo và phân phối lưu trữ .cma (với mô-đun Unix không được liên kết trong) thay vì tệp thực thi. Sau đó sử dụng ocaml để liên kết động trên nền tảng mục tiêu:

http://roscidus.com/blog/blog/2013/07/07/ocaml-binary-compatibility/#windows--linux-compatibility

Cập nhật: Đây không phải là an toàn. Khi bạn thực hiện ocaml /path/to/script.ml, nó sẽ thêm thư mục hiện tại (không phải thư mục chứa tập lệnh) vào đầu đường dẫn tìm kiếm. Do đó:

$ cd /tmp 
$ /usr/bin/myprog 

trước tiên sẽ thử tải thư viện của myprog (ví dụ: unix.cma) từ /tmp.

Phải được sửa trong 4.03: http://caml.inria.fr/mantis/view.php?id=6081

8

Rõ ràng, lý do là thư viện unix ocaml có các tên khác nhau cho C stubs tùy thuộc vào nền tảng và điều này cản trở tính di động bytecode. Tôi không thấy cách thoát ra ngoại trừ các tên cuống vá ..

+0

Làm cách nào để làm điều đó (tên bản vá lỗi)? –

+0

Bạn phải cài đặt (ít nhất) mingw dưới cửa sổ. Bạn có thể thử hack gói bằng cách thêm mingw DLL vào PATH và khởi chạy bytecode sau đó – Ontologiae

+0

Có vẻ như win_waitpid là một hàm OCaml, không phải là một hàm mingw (không phải là tôi biết gì về điều này). http://caml.inria.fr/svn/ocaml/branches/sse2/otherlibs/win32unix/winwait.c –

Các vấn đề liên quan