2016-06-16 11 views
0

静的ライブラリをリンクするには、.hと.cファイルから.libを作成する必要があります。 それを私のプロジェクトに追加し、追加の依存関係を入れてコンパイルします。Visual Studioにdllをリンクするにはどうすればいいですか?

dllを使用するには、.dllと.libが必要です。この.libは上記と同じですか、違うのですか? How do you sayビジュアルスタジオには.lllだけでなく.dllと.linを使用するのですか? 私は.dllをプロジェクトディレクトリに置き、何も変更しませんでした(.exeは同じサイズを持っています)。

+1

DLLプロジェクトは* import *ライブラリを生成します。静的ライブラリと同じではなく、非常に小さく、エクスポートした関数のみを宣言します。 .libファイルがない場合は、正しくビルドしなかったか、関数をエクスポートするのを忘れてしまいました。 –

+0

DLLプロジェクトは.dllファイルのみを作成します。 .libファイルが見つかりません – Stark

答えて

2

DLLプロジェクトをコンパイルすると、出力としてDLLとLIBファイルが取得されます。 DLLには実際のライブラリコードが含まれています。 LIBファイルには、エクスポートされた関数のスタブが含まれており、リンカがそのDLLを呼び出すためのコードを生成するのを支援します。

これは、静的ライブラリをコンパイルするときに得られるLIBファイルとは非常に異なります。 その LIBファイルには、ライブラリを構成するすべてのオブジェクトコードが含まれています。そのようなコードはすべて、ビルド時に実行ファイルに直接リンクされます。したがって、名前の「静的な」部分です。

しかし、実際の使用方法は非常に似ています。ダイナミックライブラリまたはスタティックライブラリにリンクしているかどうかに関わらず、リンカを(追加の依存関係を使用して)LIBファイルに指定します。リンカーは残りを行います。それはLIBファイルから何をするべきかを伝えることができます。

もちろん、正しいLIBファイルであることを確認する必要があります。両方のプロジェクト(DLLとEXE)を同じソリューションに置くことで、プロジェクト参照を使用できるようになり、タスクを本質的に簡単にすることができます。

EDIT: DLLのエクスポート機能がない限り、DLLをビルドすると、もちろんLIBファイルは取得されません。 (関数をエクスポートしないと、そのDLLのクライアントが呼び出すためのものは何もないので、LIBファイルは必要ありません!)DLLからエクスポートされる関数を配置する最も簡単な方法は、__declspec(dllexport)注釈。マクロと組み合わせると、コンシューマ側で__declspec(dllimport)に解決され、DLLをビルドしてアプリケーションから消費するために同じヘッダーファイルを使用できるようになります。その答えについては、hereを参照してください。また、a DEF file with an "EXPORTS" sectionを使用することもできます。

+0

DLLプロジェクト(.cと.hファイル)を作成してコンパイルした後、.dllファイルのみを取得しています。 .libはありません。 – Stark

+0

もう1つの質問:ライブラリをホストするサイトからダウンロードした.libファイルなしで既存のプリコンパイル済み.dllを使用する方法は? LoadLibrary関数とGetProcAddress関数を使用するはずですか? – Stark

+1

@starkそれは私のために働く。私は次のようにしました。 "Win32 Project"テンプレートを指定して、ソリューションに新しいプロジェクトを追加します。ウィザードでは、私は "DLL"を選んだ。私はDLLから '__declspec(dllexport)'でエクスポートしたいすべての関数に注釈を付け、プロジェクトを構築しました。出力フォルダには、 'MyDLL.dll'、' MyDLL.exp'、 'MyDLL.ilk'、' MyDLL.lib'、そして 'MyDLL.pdb'があります。だから私はあなたの問題は、DLLから関数をエクスポートしていないことだと思います。これはDLLをむしろ役に立たなくします。 –

1

DLLを持つスタティックLIBまたは(小)LIBでは、両方ともヘッダーファイル(または明示的な関数宣言)が必要です。しかし、LIBSの間で異なるがある:

  • (動的)DLL:.LIBは、ヘッダファイルのようなものである、と.dllファイルは.CPPファイルのようなものです。宣言を含むヘッダーのように、.LIBにはインポート定義が含まれています。 CPPに定義が含まれているように、.DLLには実際のコードが含まれています。
  • 静的LIB:クラス全体が.H(ほとんどの場合はテンプレートの場合)に実装され、添付された.CPPファイルはありません。この種類のLIBには、プログラムが動作するためのすべてのコードが含まれています。ちょうど同じように、リンカは欠落している実装(上記の.CPP)について不平を言うことはありません、ローダ(OS)はDLLの不足について不平を言わないでしょう。

    DLLベースのライブラリは小さく、静的ライブラリは大きいです(.H/.CPPの類推をここに入れてください)。

関連する問題