7

私は、いくつかの OS API と通信するために Windows でカスタム .dll と .lib を必要とする Haskell ライブラリ パッケージに取り組んできました。.lib はextra-librariesフィールドでライブラリにリンクされ、DLL は で cabal パッケージ ディレクトリにインストールされますdata-files

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

.lib は、インストール時に Cabal/GHC によってライブラリ用に生成された .a ファイルに既にリンクされているはずです。そうではありませんか?もしそうなら、誰かがその理由を説明できますか?

4

1 に答える 1

1

部分的なリンクが必要なようです (マニュアル ページ--relocatableのフラグを参照してください)。ldソースからわかるように、cabalは部分リンクのみのライブラリを使用し、ghci. Distribution.Simple.GHC (buildLib関数)から:

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を参照)。これは、フラグ ( のショートカット) を使用して呼び出します(結合オブジェクトファイルを参照)。arghcild-r--relocatable

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

于 2013-07-03T11:26:08.620 に答える