2016-09-12 63 views
1

我已經在我的Mac OS中編寫了一行OCaml程序:print_string "hello world!\n"。然後我編譯它ocamlopt -o test test.ml,生成的test工作正常。在Mac OS中編譯的可執行文件無法在Ubuntu服務器中運行?

然後我scp test到我的Ubuntu & Nginx服務器,其中OCaml沒有安裝。我啓動了./test,並且出現錯誤:-bash: ./code: cannot execute binary file: Exec format error

所以我必須在服務器上安裝OCaml,並在那裏編譯我的程序?難道不能以某種方式在Mac OS中編譯我的程序,使得可執行文件可以在Ubuntu服務器上運行嗎?

+1

除了Jeffrey的回答,您還可以交叉編譯,在Docker容器中構建可執行文件,並從容器中提取生成的二進制+鏈接的.so文件,或者在與目標主機相匹配的虛擬機中構建。 – hcarty

回答

1

可執行(二進制)格式在系統中不可移植,沒有。 ocamlopt生成一個格式,該格式對於編譯的系統是原生的,除非它是相同的類型,否則不應該指望它在任何其他系統上運行。

您可以通過編譯爲字節碼來代替(使用ocamlc而不是ocamlopt)來獲得可移植性。但是,字節碼可執行文件運行速度較慢。

+0

我將'ocamlc -o code code.ml'和scp'code'編譯到服務器。在服務器中,'。/ code'返回'-bash:./code:/Users/softtimur/.opam/4.02.3/bin/ocamlrun:糟糕的解釋器:沒有這樣的文件或目錄。 – SoftTimur

+1

您的字節碼解釋器(ocamlrun)需要位於兩個系統的相同位置,或者您可以使用「ocamlrun代碼」運行字節碼。 –

+0

所以我仍然需要在服務器上安裝'ocamlrun'?我應該在服務器上安裝ocamlrun還是整個OCaml? – SoftTimur

相關問題