二进制是指字节码和本机代码。
我已经构建了一个仅依赖于标准库的程序,使用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会在我的程序中嵌入部分标准库,而不是用{{1}打包它们相反。
特别是因为字节码似乎在OCaml版本之间不兼容。我的意思是,我不能用v4.01构建,然后用v4.02运行,反之亦然。
从技术角度来看,我很好奇,但只要字节码可以在Unices中移植,我就可以忍受。但是,从法律角度来看,这让我担心嵌入LGPL许可的部分的字节码可执行文件的分发。这可能是为什么将其他例外应用于OCaml库的原因。
2)我的问题的第二部分是,ocamlrun
在运行时的二进制依赖关系是什么?虽然字节码可移植性对于分发来说很有用,但是版本之间的不兼容性会使目的失败。在OCaml升级之后,您将如何设置仍然运行各种OCaml版本的字节码程序?
我以简单的方式尝试保留ocamlrun
的副本,其版本与构建字节码可执行文件的ocamlrun
相同。然后在已安装较旧OCaml实现的计算机上使用此ocamlc
运行此可执行文件。正如所料,这种情况很糟糕。
奖金问题)我没有Windows构建机器。我的程序执行Windows中不存在的系统调用;它是在Mac上构建的,但在Linux上工作正常。假设没有32位/ 64位问题,它是否可能在实践中运行在Cygwin上?
我无法通过谷歌搜索所有信息来找到信息,所以我甚至欣赏指向最新描述的指针。
干杯!
编辑:我试图找出是否可以避免源代码重新编译。使用案例:
ocamlrun
B
的副本,并按照those binaries
,您仍然可以在不破坏其他所有内容的情况下运行these steps
。我有B
,但我对B
和those binaries
一无所知。我尽可能不去框架,并为用户保持简单。
我已经知道OCaml Binary Compatibility issues with Windows了,但是由于Cygwin在提供POSIX抽象层方面做得很好,我想知道是否有人成功运行了一个利用POSIX特定系统的字节码可执行文件Unix,Sys等模块的功能(例如信号;否则仅对Windows进行模拟sigkill)。我没有谈到MinGW等的交叉编译,而是使用Cygwin控制台动态链接Cygwin DLL。
答案 0 :(得分:2)
1)是的,所用模块的cmo
与您的字节码程序相关联。
是的,基元的C库是动态链接的。
字节码应该可以移植到同一版本的任何ocamlrun
:由于这个原因,OCaml的初始引导编译器boot/ocamlc
将作为字节码分发。
您可以使用ocamlrun
选项明确地将-custom
与您的字节码相关联,但ocamlrun
约为半mb并将其附加到每个字节码可执行文件是浪费。
我认为您对OCaml连接LGPL例外的猜测是正确的。
2)正如我所说,字节码可移植性仅适用于相同版本的运行时。如果我们升级OCaml版本,我们只需重新编译一切。在一些小的升级中,旧的字节码可以在新的ocamlrun
中工作,因为在升级中字节码没有改变......但它只是靠运气而你永远不应该依赖它。顺便说一句,OPAM允许您拥有多个OCaml系统,如果您想保留较旧的字节码程序,可能需要使用它。
奖金问题)取决于。例如,boot/ocamlc
是OCaml的初始引导编译器,适用于所有系统。但是如果你的字节码依赖于OS特定的外部原语,那么它就无法在其他系统上运行。例如,Unix
在Unix和Windows中具有不同的C基元集,因此与Unix
链接的字节码程序在Unix和Windows上都不能正常工作。