2011-12-07 7 views
3

誰も返信しなかったquestion on the 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' 

、私は最終的にリンクラインで立ち往生ocamlbuildを通じて動的ライブラリを構築する。これは、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のバグのようです。誰も似たような状況を経験しましたかコンパイル時に何かまたはオプションが欠けていますか?

ありがとうございました。


EDIT

私のソリューションは、ここでは再現できないmyocamlbuild.ml

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

答えて

2

にフラグを経由してオプションを渡すだけです。

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

NBオプション-sharedはocamloptには渡​​されず、代わりに動的プラグインをリンクすることができ、共有ライブラリ用の特別なCリンカー(同じ名前のオプションでgccになる)が選択されます。 -ccを指定すると、全体として優先されます。

+0

はい、それは私のプラグインに渡されますが、それは必要です。 -ccopt/-cclib w/-sharedを渡すと問題が解決されます。私はccを選ぶ際に、そのコンパイラで共有オプションが利用できないかもしれないと思います。私はocamlbuildで何かを管理できるように見えます。ありがとう。 – nlucaroni

+0

私は分かりません。 cmxsをビルドするときに-cc 'somecc -shared'を渡すか、-ccをまったくパスしないでください。 – ygrek

関連する問題