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自動綁定。