2011-12-22 39 views
11

.dll/.libsの使用方法に関する一般的な質問があります。私は私のプロジェクトに使用される.dllを作成していますが、私がコンパイルするときには、.dllに関連付けられた.libを静的にリンクしてプロジェクトをコンパイルする必要があることに気付きました(そうでなければ、リンクエラー "fatalエラーLNK1107:無効または破損したファイル:0x300で読み取ることができません ")。だから後で私のプロジェクトをredistrobuteして、それを将来更新したら、新しい.exeと新しい.dllを新しい.dllだけでなく出荷する必要がありますか?もしそうなら、.dllを使って気にするのはなぜですか?exeエラーにリンクするライブラリとDLL "0x300で読み込めません"

答えて

29

.libには、DLLによってエクスポートされる関数などのスタブが含まれています。 .libをEXEにリンクすると、EXEは関数の呼び出し方法を知るようになります。もちろん、そこには機能はありません。コールはどこにも行きません。ロード時に、オペレーティングシステムがEXEを読み込むと、DLLもロードされ、EXEがスタブに呼び出される場所にローダーが置き換えて、DLLの実際の関数に置き換えます。

通常、お客様に.libを出荷する必要はありません。しかし、お客様のDLLを使用する独自のEXEを作成する場合は、.libを送信してEXEとそのDLLをリンクさせる必要があります。

リンカエラーLNK1107は、.libではなくDLLにリンクしようとしたことを意味します。定義上、DLLはビルド時に静的にではなく実行時に動的にリンクされるため、常に間違っています。

+0

私はあなたが提案したものを試しています。私の問題は、私がデバッグモードでビルドしても、libファイルが生成されないということです。 dllファイルのみが生成されます。どのように私はデバッグバージョンでlibファイルを生成することができます。 –

+0

あなたのコメントは、あなたがリリースビルドでlibファイルを取得することを示唆しているようですが、デバッグビルドではありません。そうですか?その場合は、両方のビルドで同じリンカオプションを設定していることを確認してください(もちろん、リリースとデバッグの間で異なる必要があるものは除く)。 –

+0

DLLには、通常、インポートライブラリが自動的に生成されます関数を__declspec(dllexport)属性で使用するか、DEFファイルを使用して明示的に関数をエクスポートする場合に使用します。 __declspec(dllexport)は、#ifndef(_DEBUG)などで囲まれているため、コンパイラによって除外されている可能性があります。 –

関連する問題