我已经准备好我的OCaml项目来编译/链接/运行在某些库不可用的系统上(yojson,curl,cryptokit但可能并不那么重要)我该怎么做?OCaml如何建立静态项目
到目前为止我所用:
$ ocamlbuild -use-ocamlfind -pkgs curl,yojson,netstring,cryptokit,netclient,lablgtk2.auto-init,pgocaml tweetomat.native
如果一些包丢失了它显然是行不通的。我的尝试是寻找库路径输入
$ ocamlfind printconf path
和手动复制缺少库文件夹项目的文件夹,这里listining他们的
$ 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'
我google了一下,它看起来像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 /卷曲/ cryptokit取决于> :( 你能帮我家伙此外也存在一些简单的方法来做到这一点使用ocamlbuild
您可以使用“ocamlobjinfo”来确定需要其他外部库。 –
nlucaroni
......但这是这些构建系统的全部要点,所以我不知道你为什么要手动调用所有这些构建步骤。我是否理解你想分发编译的库供其他人编译?为什么不能静态编译你的项目进行分发? (假设许可证允许)。 – nlucaroni
>我是否明白你想分发编译的库供其他人编译? 没有确切的理由说明我为什么要这样做,我只想从源文件* .ml,* .mli(也可能是上面这些库的一些其他文件)构建我的项目直至可执行文件。如果您能详细说明“为什么不为编译静态编译项目?”,我将不胜感激。如果没有提到的库,它会在另一个发行版上工如果是这样,这是我正在寻找的证明。 – 108592