【问题标题】:Basic Ocaml: How do I compile this?Basic Ocaml:我如何编译这个?
【发布时间】:2014-10-05 21:22:29
【问题描述】:

刚从 ocaml 开始,并且正在努力使用各种编译器和工具。例如。 ocamlopt、ocamlc、ocamlbuild、corebuild 等等。那么,我该如何编译以下内容呢?

open Core.Std

module Regex = Re2.Regex

let ls pattern = 
  let pat = Regex.create_exn pattern in
  let matcher = Regex.matches pat in
  Sys.ls_dir "." 
  |> List.filter ~f:matcher
  |> List.iter ~f:(fun s -> print_string s; print_newline ())

let () =
  match In_channel.input_line stdin with
  | None -> print_string "No Input"
  | Some pat -> ls pat

在utop 我可以在#require "re2" 然后从那里开始。

如果不包含正则表达式模块,我将只使用corebuild ls.native,假设上面的代码放在ls.ml 中。

[编辑]

目前尝试过

ocamlbuild -use-ocamlfind -package core -package re2

吐出来

ocamlfind ocamldep -package core -package re2 -modules ls.ml > ls.ml.depends
ocamlfind ocamlc -c -package core -package re2 -o ls.cmo ls.ml
+ ocamlfind ocamlc -c -package core -package re2 -o ls.cmo ls.ml
ocamlfind: Error from package `threads': Missing -thread or -vmthread switch
Command exited with code 2.

所以在谷歌搜索后我被引导到this blog 我尝试了

ocamlbuild -tag thread -use-ocamlfind -package core -package re2

在失败之前会吐出 6000 多行类似于 make 的输出:

collect2: error: ld returned 1 exit status
File "caml_startup", line 1:
Error: Error during linking
Command exited with code 2.

所以我不确定接下来要尝试什么。

【问题讨论】:

  • 用ocamlbuild -use-ocamlfind -package re2 -package core ls.byte 可以很好地编译,但是在编译到本机时遇到了麻烦。
  • 勇敢者:gist.github.com/anonymous/971d9501385e144855d7 第一个文件是 ocamlbuild 的输出,第二个是正在编译的文件。

标签: ocaml opam


【解决方案1】:

我在 64 位机器上使用 Ubuntu 14.04。我放弃了 ocaml 的 apt-get 版本:

sudo apt-get remove --purge ocaml ocaml-base-nox ocaml-compiler-libs \ 
                            ocaml-interp ocaml-native-compilers \ 
                            ocaml-nox campl4 ocaml-base ocaml-docs opam 

然后我根据here 的说明从源代码安装了 opam。

接下来我用opam install core utop re2安装了core、utop和re2

最后我跑了ocamlbuild -use-ocamlfind -package re2 -package core -tag thread ls.native

它构建了所需的可执行文件。

【讨论】:

    【解决方案2】:

    我建议你使用绿洲工具。这并不像人们想象的那么难。但它消除了你所有的图书馆负担。

    让我们为您的项目创建一个简单的_oasis 文件:

    OASISFormat: 0.4
    Name:        ls
    Version:     0.1
    Synopsis:    Testing oasis
    Authors:     Fizz_ed
    License:     MIT
    Plugins:     META (0.4), DevFiles (0.4)
    BuildTools: ocamlbuild, camlp4o
    BuildDepends: core, camlp4, threads, 
                  sexplib.syntax, 
                  bin_prot.syntax, 
                  comparelib.syntax, 
                  herelib, 
                  herelib.syntax
    
    Executable "ls"
      Path: .
      MainIs: ls.ml
      CompiledObject: best
      BuildDepends: re2
    

    创建此文件后,运行oasis setup 命令(如果未安装oasis,则使用 opam 或您的包管理器安装它)。

    之后,您将拥有一个通用的 configure 脚本和 makefile。所以你只需要输入

    ./configure
    make 
    

    您的文件将被编译。

    或者你可以直接使用ocamlbuild,它也可以,因为oasis创建了所有必要的文件

    ocamlbuild ls.native
    

    关于文件的一些解释。前言包含构建核心风格应用程序所需的一切。

    Executable 部分描述了您的可执行文件,并且还添加了对 re2 库的依赖项。

    更新:修复了一些问题。

    【讨论】:

    • 调用oasis setup 返回W: Unknown license 'BSD-3-clause' in 'BSD-3-clause'
    • 好的,让我们尝试一些更简单的方法。以麻省理工学院为例。我已经更新了帖子。也许你的绿洲太老了……
    • 顺便说一句,这只是一个警告,W 代表什么,所以它应该可以工作
    • 所以是的,这只是一个警告。做了./configure; make 但得到了与上面相同的错误(在 6k 行输出之后),然后是一个额外的错误:E: Failure("Command ''/home/thatsme/.opam/4.01.0/bin/ocamlbuild' ls.native -tag debug' terminated with error code 10")
    • (为了确保我们在这里保持理智,它确实在 utop 中运行)
    猜你喜欢
    • 2016-10-12
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多