1

一部のライブラリが利用できないシステム (yojson、curl、cryptokit ですが、おそらくそれほど重要ではありません) でコンパイル/リンク/実行するために OCaml プロジェクトを準備する必要があります。

これまで私は使用していました:

$ 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 を使用してそれを行う簡単な方法はありますか?

4

1 に答える 1

2

依存関係のインクルード パスを手動で指定しないでくださいocamlfind。処理させてください。そのため、そのライブラリを 経由で利用できるようにする方法に疑問が残りますocamlfind

また:

  • opam不足している依存関係をダウンロードしてインストールするために使用します
  • 依存関係がオプションでない場合opam- 他のライブラリを tarball としてプロジェクトと共に配布し、必要に応じてビルド スクリプトを展開してビルドします (ビルド手順はライブラリごとに異なる場合があります) - 通常どおり ( 経由でocamlfind) インストールします。

    ocamlfindだけが書き込み可能なシステム ディレクトリにインストールする際に問題が発生する可能性がありますroot。これは、環境変数を設定しocamlfindて、インストール先と検索元の別のディレクトリを指定することで処理できます。

    ある日から自動化するまでは、手動でバンドルすることになりますopam

于 2014-02-13T05:15:18.590 に答える