1

我已经准备好我的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

+0

您可以使用“ocamlobjinfo ”来确定需要其他外部库。 – nlucaroni

+0

......但这是这些构建系统的全部要点,所以我不知道你为什么要手动调用所有这些构建步骤。我是否理解你想分发编译的库供其他人编译?为什么不能静态编译你的项目进行分发? (假设许可证允许)。 – nlucaroni

+0

>我是否明白你想分发编译的库供其他人编译? 没有确切的理由说明我为什么要这样做,我只想从源文件* .ml,* .mli(也可能是上面这些库的一些其他文件)构建我的项目直至可执行文件。如果您能详细说明“为什么不为编译静态编译项目?”,我将不胜感激。如果没有提到的库,它会在另一个发行版上工如果是这样,这是我正在寻找的证明。 – 108592

回答

1

不要手动指定包括路径依赖 - ?让ocamlfind处理它。所以问题如何通过ocamlfind来提供这些库,

或者:

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

    可能存在ocamlfind安装到只能由root写入系统目录的问题。这可以通过设置环境变量告诉另一个目录ocamlfind来安装和查找。

    这将是手动绑定,直到有一天我们从opam自动绑定。