我必须准备我的 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 的更简单的方法来做到这一点?