74474


`opam install zarith` で Zarith をインストールして使おうとしたのですが、ocamlc
でバイトコンパイルしようとしたところ、モジュールが見つからないと言われてしまいます。何か追加の設定が必要なのでしょうか？ `eval $(opam
env)` はしています。

[code]

    $ cat main.ml
    let () =
      let n = Z.of_string "111111111111111111111111111111" in
      Z.(n + n) |> Z.to_string |> print_endline
    $ ocamlc -o main zarith.cma main.ml
    File "main.ml", line 2, characters 10-21:
    2 |   let n = Z.of_string "111111111111111111111111111111" in
                  ^^^^^^^^^^^
    Error: Unbound module Z
    
[/code]

## 環境情報

[code]

    $ cat /etc/os-release | grep PRETTY_NAME
    PRETTY_NAME="Ubuntu 18.04.5 LTS"
    $ ocaml --version
    The OCaml toplevel, version 4.12.0
    $ opam --version
    2.0.8
    $ opam list --installed | grep zarith
    zarith                1.12        Implements arithmetic and logical operations over arbitrary-precision integers
    
[/code]


CC BY-SA 4.0
2021-03-07T05:30:07.400
74473
2021-03-07T05:30:07.400
19110
question
ocaml
OPAM でインストールしたはずのライブラリを使おうとしても Unbound module になる


このエラーは ocamlc が zarith.cma を見つけられていないがために起こっています。

ocamlc はそのままだとライブラリの置いてあるパスを探索してくれないので、こちらから指定する必要があります。

## 解決法1: ビルドシステムを使う

[Dune](https://dune.build/)
などのビルドシステムを使うのが一番のオススメです。実行する度に長いオプションを詠唱しなくて済みますし、その他の設定も自動で行ってくれます。

Dune を使うのであれば、とりあえず次のようにすればビルドできます。Dune 2.8.2 で動作確認しています。

[code]

    $ mkdir my_first_dune_project && cd my_first_dune_project
    $ dune init exe my_first_dune_project
    
[/code]

これで `dune` ファイルと `my_first_dune_project.ml` が生成されるので、以下のように編集します。

`dune`

[code]

    (executable
     (name my_first_dune_project)
     (libraries zarith))
    
[/code]

`my_first_dune_project.ml`

[code]

    let () =
      let n = Z.of_string "111111111111111111111111111111" in
      Z.(n + n) |> Z.to_string |> print_endline
    
[/code]

あとはビルドして実行すれば良いです。

[code]

    $ dune build
    $ dune exec ./my_first_dune_project.exe
    222222222222222222222222222222
    
[/code]

## 解決法2: ocamlfind を直接使う

ビルドシステムを使わない場合、Findlib が提供している ocamlfind を使う方法が簡単です。公式チュートリアル [Compiling OCaml
projects](https://ocaml.org/learn/tutorials/compiling_ocaml_projects.html)
にも書かれている方法です。

以下のように書くとコンパイルできます。

[code]

    $ ocamlfind ocamlc -o main -linkpkg -package zarith main.ml
    
[/code]

このように書くことで、ocamlfind が自動的に zarith を探索可能にしてくれます。

`-linkpkg` や `-package` は Findlib が追加するオプションです。詳しくはマニュアルの
<http://projects.camlcity.org/projects/dl/findlib-1.8.1/doc/guide-
html/x119.html> や
<http://projects.camlcity.org/projects/dl/findlib-1.8.1/doc/ref-html/r17.html>
に書かれています。

## 解決法3: ライブラリのパスを直接指定する

ocamlc に `-I` や `-L` などのオプションを使って探索パス等を直接渡してあげることで、ocamlfind
がやっていることを手動で行うことができます。


CC BY-SA 4.0
2021-03-07T05:30:07.400
74474
2021-03-07T05:30:07.400
19110
74473
answer