2017-02-20 6 views
4

私のプロジェクトはctypesライブラリとマークアップライブラリを使用しています。コンパイルすると、次のような不平を言います。OCamlでは、2つのサードパーティライブラリが同じモジュール名を公開しています。リンクできません

Error: Files /Users/Young/.opam/4.02.1/lib/markup/markup.cmxa 
     and /Users/Young/.opam/4.02.1/lib/ctypes/ctypes.cmxa 
     both define a module named Common 

明らかに、両方のライブラリで同じモジュール名が公開されています。それを修正するには?どんな助けもありがとう。ありがとう。

更新: また、このような競合が発生する理由はわかりません。私の理解では、たとえ両方のライブラリが同じモジュールCommonを公開していても、Ctypes.CommonとMarkup.Commonの対比で表示されます。矛盾はないはずですか?一般的に

+0

アップストリームに報告する必要があります。 –

答えて

4

、あなたは、このようなエラーが発生した場合には、あなたが対応するモジュールの名前を変更するために、ライブラリのメンテナに依頼する必要があるので、上流を変更せずにこの問題を解決することはできません。

あなたのケースでは、ctypesライブラリの新しいバージョンを使用すると、マインマシンのように、ctypes(バージョン0.11.2)ライブラリでCommonモジュールが定義されなくなります。

更新:なぜこのような競合が起こるのかよくわかりません。私の理解では、たとえ両方のライブラリが同じモジュールCommonを公開していても、Ctypes.CommonとMarkup.Commonの対比で表示されます。矛盾はないはずですか?

あなたの理解は、多かれ少なかれ正確です。しかし、いくつかの詳細はありませんが、ライブラリはコンパイル単位のコレクションであり、各コンパイル単位はモジュールの集合です。コンパイル単位は基本的にファイルにマップされます。たとえば、ファイルがcommon.mlの場合、コンパイル単位はcommonになります。ライブラリとコンパイル単位はフラットな名前空間にあり、モジュールは一般に階層的な名前空間に残ります。あなたは、最新のコードベースを見ていきますならば、あなたはすべてのファイル名がctypes_が付いていることがわかります理由は、ライブラリが構築されて、そこからファイル名が異なる名前を持っていなければならないこと、を意味し、それはです。この名前空間の問題を緩和するための部分的な解決策があります。その場合、パックされたモジュールを使用できます。その場合、モジュールは1つだけです(通常、ライブラリと同じ名前)。

+0

コメントありがとうございます。残念ながら、私はctypesののバージョンが必要async_sslを使用<(= 0.6 =あなたは古いasync_sslを使用している0.4.0 –

+0

、新規の方など、async_ssl.113。+はctypesのを必要と>)。私が知る限り、最新の非同期(113バージョンから開始)にはOCaml 4.02.3以上が必要です。 – ivg

+0

ありがとうございます。それを調べます。ところで、どうして私たちはモジュール間でこのような矛盾があるのでしょうか?私の理解では、たとえ両方のライブラリが同じモジュールCommonを公開していても、Ctypes.CommonとMarkup.Commonの対比で表示されます。 –

関連する問題