二進制我的意思是字節碼和本地代碼。二進制文件如何嵌入並在字節碼可執行文件和ocamlrun之間分開?
我已經建立了一個程序,僅依賴於標準庫上,使用ocamlbuild
用一組標誌的最小:
ocamlbuild -I … -use-ocamlfind -libs str program.byte
它運行正常。僅供參考,我使用OCaml 4.02.1,Mac OS X Mountain Lion。
隨着ocamlobjinfo program.byte
我得到它的內容概述:
…
Imported units:
9c1885d2c36e2eb94f56f21da9040d87 UnixLabels
30a4cc8e5f4f902ea609c91caec48af7 Unix
0ce699458ce4430954d7e6a78874647c Sys
…
8988208489274193e4e3f69dc6ec2f75 MyModule1
4164567363e873f17809de38a8c5f09e MyModule2
…
Used DLLs:
dllcamlstr
dllunix
Primitives used:
re_string_match
re_partial_match
…
1)我的理解是,program.byte
嵌入了我的整個字節碼。我想它嵌入了我使用的標準庫模塊的整個字節碼,但是它呢?
我假設ocamlrun
在運行時加載2個動態加載的庫,通過這樣做,它能夠找到原語;它們是標準庫所必需的。
我認爲如果沒有ocamlrun
就不能運行字節碼可執行文件,所以我不明白爲什麼OCaml會在我的程序中嵌入部分標準庫,而不是用ocamlrun
打包它們。
特別是因爲字節碼似乎在OCaml版本之間不兼容。我的意思是,無論如何,我無法用v4.01構建,然後用v4.02運行,反之亦然。
從技術角度來看,我很好奇,但只要字節碼在Unices中可移植,我就可以忍受。然而,從法律角度來看,這讓我擔心嵌入LGPL許可的字節碼可執行文件的分發問題。這可能是爲什麼額外的例外適用於OCaml庫。
2)我的問題的第二部分是,運行時ocamlrun
的二進制相關性是什麼?儘管字節碼可移植性對於分發來說是很好的,但版本之間的不兼容事物卻破壞了目的。在OCaml升級之後,你將如何設法運行各種OCaml版本的字節碼程序?
我試着簡單地保留ocamlrun
的副本,其版本與構建字節碼可執行文件的ocamlc
相同。然後在安裝了舊版OCaml的計算機上運行此可執行文件,該文件爲ocamlrun
。如預期的那樣,失敗慘敗。
獎金問題)我沒有Windows生成機器。我的程序執行Windows中不存在的系統調用;它是在Mac上構建的,而且現在可以在Linux上正常工作。假設沒有32位/ 64位的問題,它是否可能在Cygwin上運行?
我無法通過使用Google搜索來查找信息,所以我甚至可以欣賞指向最新描述的指針。
乾杯!
編輯:我試圖找出是否可以避免源代碼重新編譯。使用案例:
- 我提供了一個字節碼可執行
B
- 我可以告訴用戶:「所以你不會在六個月內使用OCaml的版本XYZ了/一兩年好了,不用擔心,從XYZ分佈保持的
those binaries
副本,並按照these steps
,你仍然可以運行B
沒有打破一切。
我有B
,但我不知道those binaries
和these steps
什麼。儘可能多儘可能我寧願不要去框架,並保持簡單的用戶。
我已經知道了OCaml Binary Compatibility issues with Windows,但是由於Cygwin在提供POSIX抽象層方面做得非常好,我不知道是否有人成功運行了利用Unix的POSIX特定系統特性的字節碼可執行文件, Sys等模塊(,例如信號;否則對於Windows,只能仿真sigkill)。我沒有談及MinGW等的交叉編譯,而是與Cygwin DLL動態鏈接 - 就像使用Cygwin控制檯一樣。
感謝您確認我的擔憂:p我編輯了我的問題。我不知道在添加'-lflag -custom'後字節碼可執行文件是否仍然可以移植,但在我的最後還是缺少了一些東西:程序不能在其他地方運行。 – eruve