1

我正在尝试在“示例”文件夹中的https://github.com/mirage/mirage-tcpip构建示例。

首先,我opam install . 在根目录中安装了所有依赖项。然后我做了dune build,它构建了_build很多.a, .cma, .cmx, .cmi, .cmxa文件,我不知道它们的用途是什么(有人可以解释吗?)。

无论如何,我认为这些示例必须单独构建,因为它们有自己的沙丘文件。但我尝试dune build在它们身上运行并得到:

root@66f08fd7c55b:/workspaces/ocaml_env/mirage-tcpip/examples/ping# dune build
Entering directory '/workspaces/ocaml_env/mirage-tcpip'
root@66f08fd7c55b:/workspaces/ocaml_env/mirage-tcpip/examples/ping# ls
dune  ping.ml
root@66f08fd7c55b:/workspaces/ocaml_env/mirage-tcpip/examples/ping# cat dune 
(executables
 (names ping)
 (libraries cmdliner logs logs.fmt tcpip.icmpv4-socket))
root@66f08fd7c55b:/workspaces/ocaml_env/mirage-tcpip/examples/ping# dune build ping
Entering directory '/workspaces/ocaml_env/mirage-tcpip'
Error: Don't know how to build ping
4

1 回答 1

1

OCaml 文件类型说明:

关于_build目录中的文件类型(参考 1参考 2):

  • .a是包含本机代码的标准存档文件(也称为静态库):

    以 .o 或 .a 结尾的参数(Windows 下为 .obj 或 .lib)被假定为 C 目标文件和库。在 -custom 模式下链接时,它们被传递给 C 链接器(请参阅下面的 -custom 描述)。

  • .cma.a文件的 OCaml 字节码等价物,因此是静态库,但使用独立于平台的 OCaml 字节码而不是依赖于机器的本机代码:

    以 .cma 结尾的参数被视为对象字节码库。对象字节码库将一组对象字节码文件(.cmo 文件)打包在一个文件中。

  • .cmx包含有关如何将本机代码对象文件链接在一起的元数据:

    以 .ml 结尾的参数被视为编译单元实现的源文件。... 从文件 x.ml 中,ocamlopt 编译器生成两个文件:xo,包含本机目标代码,和 x.cmx,包含用于链接和优化单元客户端的额外信息。

  • .cmi是编译的接口定义文件:

    以 .mli 结尾的参数被视为编译单元接口的源文件。接口指定编译单元导出的名称:它们用类型声明值名称、定义公共数据类型、声明抽象数据类型等等。从文件 x.mli 中,ocamlopt 编译器在文件 x.cmi 中生成一个已编译的接口。

  • .cmxa是结合.a/.o和 和.cmx文件的本机代码库文件,例如,.a但带有来自文件的附加链接信息.cmx

    以 .cmxa 结尾的参数被视为目标代码库。

构建示例

关于ping示例的构建,要使用 构建可执行目标dune,您必须附加.exe到目标名称(参考):

请注意,本机代码可执行文件在所有平台(包括非 Windows 系统)上都具有 .exe 扩展名。

所以构建命令的完整序列将是:

  • 安装依赖项:

    $ opam install .
    
  • 构建mirage-tcpip

    $ dune build
    
  • 构建ping示例:

    $ cd example/ping
    $ dune build ping.exe
    
  • 运行二进制文件:

    # dune exec ./ping.exe 8.8.8.8
    

    或者,从mirage-tcpip目录中:

    # ./_build/default/examples/ping/ping.exe 8.8.8.8
    
于 2020-09-23T20:41:01.270 回答