2013-07-02 6 views
7

私は、Windows上でカスタムの.dllと.libを必要とするHaskellライブラリパッケージに取り組んでいます。これは、いくつかのOS APIと話すためです。 .libはextra-librariesフィールドでライブラリにリンクされ、DLLはcabalパッケージディレクトリにdata-filesでインストールされます。ライブラリーをコンパイルするために必要な静的.libもライブラリー・ユーザーには必要ですか?

私のパッケージ(build-dependsフィールド)を使用するテスト実行ファイルを作成すると何らかの理由で(私は何らかの手段でリンクするのは専門家ではありませんが、これは奇妙に思えます) libはライブラリのコンパイルに使用されます。ライブラリ関数を呼び出すだけで、.libが公開するものではありません。明らかに、実行時に.dllにアクセスする必要がありますが、それは予想されます。 .libも同様に必要とするのは奇妙なようです。

私のライブラリのためにCabal/GHCによって生成された.aファイルに既に.libがリンクされていることが予想されます。これは当てはまりませんか?それがあれば誰かがその理由を説明できるのだろうか?

答えて

1

部分的なリンクが必要です(ldマニュアルページの--relocatableフラグを参照)。ソースからわかるように、cabalは部分リンクのみのライブラリを使用し、ghciのためにコンパイルされています。 Distribution.Simple.GHCbuildLib機能)から:

whenVanillaLib False $ do 
    (arProg, _) <- requireProgram verbosity arProgram (withPrograms lbi) 
    Ar.createArLibArchive verbosity arProg 
    vanillaLibFilePath staticObjectFiles 

whenProfLib $ do 
    (arProg, _) <- requireProgram verbosity arProgram (withPrograms lbi) 
    Ar.createArLibArchive verbosity arProg 
    profileLibFilePath profObjectFiles 

whenGHCiLib $ do 
    (ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi) 
    Ld.combineObjectFiles verbosity ldProg 
    ghciLibFilePath ghciObjFiles 

whenSharedLib False $ 
    runGhcProg ghcSharedLinkArgs 

あなたはバニラのためにとライブラリをプロファイリング、cabalはちょうど(createArLibArchiveを参照)arユーティリティを呼び出すことを、見ることができます。 ghciについては、を-rフラグ(--relocatableのショートカット)と呼びます(combineObjectFiles参照)。

したがって、cabalは、実際にはバニラライブラリのリンクを行わず、オブジェクトファイルを結合するだけです。実際にcabalは、最終的なアプリケーションがあなたのextra-libからのシンボルを使用するかどうかを知ることができません。

+0

バニラライブラリに 'ar'の代わりに' ld -r'を使用する方法はありますか? 'ld-options:-r'を追加しようとしましたが、何もしないようです(おそらく' ld'が使用されていないためでしょうか?) –

+0

@TomSavageいいえ、私はそれは不可能だと思います。しかし私はカバールの専門家ではない。 – Yuras

関連する問題