3

私は ocaml listserv に質問を投稿しましたが、誰も応答しませんでした。ここの誰かが私を馬鹿だと呼ぶか、状況を確認するか、創造的な解決策を提供してくれることを願っています。

動的ライブラリをビルドするときocamlbuildに、最終的なリンク行で行き詰まり、

/opt/ocaml-3.12.1/bin/ocamlopt.opt -shared -verbose -cc gcc plugins/example.cmx -o plugins/example.cmxs -ccopt -v
+ as -o 'plugins/example.cmxs.startup.o' '/tmp/camlstartupe6993f.s'
+ gcc -o 'plugins/example.cmxs'   '-L/opt/ocaml-3.12.1/lib/ocaml' -v 'plugins/example.cmxs.startup.o' 'plugins/example.o'

これにより、hereのようなエラーが発生します。-ccこのエラーは、オプションを削除して-sharedフラグが に渡されると修正されgccます。

/opt/ocaml-3.12.1/bin/ocamlopt.opt -shared -verbose plugins/example.cmx -o plugins/example.cmxs -ccopt -v
+ as -o 'plugins/example.cmxs.startup.o' '/tmp/camlstartup2c31a2.s'
+ gcc -shared -o 'plugins/example.cmxs'   '-L/opt/ocaml-3.12.1/lib/ocaml' -v 'plugins/example.cmxs.startup.o' 'plugins/example.o'

OCamlbuild は-ccオプションをすべてに渡すので、それを削除することはできません。ocamlopt のバグのようです。誰かが同様の状況を経験しましたか?コンパイルで何かまたはオプションが不足していますか?

ありがとう。


編集

私の解決策は、myocamlbuild.ml のフラグを介してオプションを渡すことです。

flag ["shared"; "link"]
    (S [A"-ccopt";A"-shared"]);
4

1 に答える 1

2

ここでは再現できません。

Ocamlbuild 自体は -cc オプションを渡しません (なぜ渡す必要があるのでしょうか?)。また、ソースでもそのような動作を見つけることができません。ocamlopt は構成時に共有ライブラリのリンカーを決定するため (通常はgcc -shared)、それはおそらくプラグインによって渡されますが、-ccオプションが明示的に指定されている場合は、代わりに喜んでそれを使用します。

NB オプション-sharedは ocamlopt に「渡される」のではなく、動的プラグインのリンクを有効にし、共有ライブラリ用の特別な C リンカーを選択します (同じ名前のオプションを持つ gcc になります)。指定-ccすると、全体としてオーバーライドされます。

于 2011-12-08T08:52:12.623 に答える