1

我必须准备我的 OCaml 项目以在某些库不可用的系统上编译/链接/运行(yojson、curl、cryptokit,但它可能不那么重要)我该怎么做?

到目前为止,我正在使用:

$ ocamlbuild -use-ocamlfind -pkgs curl,yojson,netstring,cryptokit,netclient,lablgtk2.auto-init,pgocaml tweetomat.native

如果缺少某些软件包,它显然将不起作用。我的尝试是寻找库路径类型

$ ocamlfind printconf path

并手动将缺少的库的文件夹复制到项目的文件夹中,这是它们的列表

$ tree -r libs

libs/
├── yojson
│   ├── yojson.o
│   ├── yojson.mli
│   ├── yojson.cmx
│   ├── yojson.cmo
│   ├── yojson.cmi
│   ├── yojson_biniou.o
│   ├── yojson_biniou.mli
│   ├── yojson_biniou.cmx
│   ├── yojson_biniou.cmo
│   ├── yojson_biniou.cmi
│   └── META
├── curl
│   ├── META
│   ├── libcurl-helper.a
│   ├── curl.mli
│   ├── curl.cmxa
│   ├── curl.cmi
│   ├── curl.cma
│   └── curl.a
└── cryptokit
    ├── META
    ├── libcryptokit_stubs.a
    ├── cryptokit.mli
    ├── cryptokit.cmxs
    ├── cryptokit.cmxa
    ├── cryptokit.cmx
    ├── cryptokit.cmi
    ├── cryptokit.cma
    └── cryptokit.a

好的,所以我尝试逐步编译项目中的每个文件,然后使用以下命令将所有内容编译为可执行文件:

$ ocamlc -c twitter_oauth.mli
$ ocamlfind ocamlc -package netstring,netclient -I ./libs/cryptokit/ \
    -c twitter_oauth.ml
$ ocamlc -c connection.mli
$ ocamlfind ocamlc -I ./libs/curl/ -c connection.ml
$ ocamlfind ocamlc -I ./libs/yojson/ -c parser.ml
$ ocamlfind ocamlc -package pgocaml -c sql.ml
$ ocamlfind ocamlc -package lablgtk2.auto-init,pgocaml -c gui.ml
$ ocamlfind ocamlc -package lablgtk2.auto-init,pgocaml,netstring,netclient \
    -I ./libs/cryptokit/ -I ./libs/curl/ -I ./libs/yojson/ -o tweetomat \
    yojson.cmo curl.cma cryptokit.cma \
    twitter_oauth.cmo connection.cmo parser.cmo sql.cmo gui.cmo

但我得到:

File "_none_", line 1:
Error: Error while linking ./libs/yojson/yojson.cmo:
Reference to undefined global `Bi_outbuf'

我用谷歌搜索了一下,看起来 yojson 不是静态构建的,需要“biniou”库来填充依赖项(我不确定静态构建,但看起来像那样)。事实上,在将最后一个命令更改为(更改用星号标记)之后:

$ ocamlfind ocamlc -package lablgtk2.auto-init,**biniou**,pgocaml,netstring,netclient \
    -I ./libs/cryptokit/ -I ./libs/curl/ -I ./libs/yojson/ -o tweetomat \
    **biniou.cma** yojson.cmo curl.cma cryptokit.cma \
    twitter_oauth.cmo connection.cmo parser.cmo sql.cmo gui.cmo

以前的错误没有发生,但我有一个新的:

File "_none_", line 1:
Error: Error while linking ./libs/yojson/yojson.cmo:
Reference to undefined global `Easy_format'

哦,天哪,我不会包含 yojson/curl/cryptokit 所依赖的每个库 >:(。你们能帮帮我吗?此外,是否存在一些使用 ocamlbuild 的更简单的方法来做到这一点?

4

1 回答 1

2

不要手动指定依赖项的包含路径 - 让我们ocamlfind处理它。所以问题仍然在于如何通过ocamlfind.

任何一个:

  • 用于opam下载和安装缺少的依赖项
  • 如果opam依赖项不是一个选项 - 将其他库作为 tarball 与您的项目一起分发,并使构建脚本在需要时解包并构建它们(每个库的构建步骤可能不同) - 并照常安装(通过ocamlfind)。

    ocamlfind安装到仅可由用户写入的系统目录中可能存在问题root。这可以通过设置环境变量来处理,告诉另一个目录进行ocamlfind安装和查找。

    那将是手动捆绑,直到我们从opam某一天开始自动捆绑。

于 2014-02-13T05:15:18.590 回答