我已經準備好我的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