web-dev-qa-db-ja.com

Visual Studio C ++でサードパーティのDLLファイルを使用するにはどうすればよいですか?

LoadLibrary()を使用する必要があることを理解しています。しかし、サードパーティのDLLファイルを使用するには、他にどのような手順を実行する必要がありますか?

私は単にC++に飛び込みましたが、これは(Javaプログラマーとして)入手できない唯一の部分です。 Qt Libraryとtesseract-ocrを使用する方法を検討していますが、このプロセスは私には意味がなく、グーグルにとって非常に困難です。

使用している関数をコンパイラーに伝えるにはどうすればよいですか?サードパーティベンダーからのインクルードファイルが必要ですか?

68
Zombies

みんなが言うように、LoadLibraryはそれを行うのに難しい方法であり、ほとんど必要ありません。

DLLには、リンク用の.libファイルと、ソースに#includeする1つ以上のヘッダーファイルが付属している必要があります。ヘッダーファイルは、DLLから使用できるクラスと関数プロトタイプを定義します。 LoadLibraryを使用する場合でも、これが必要になります。

ライブラリとリンクするには、リンカー/入力/追加の依存関係の下のプロジェクト構成に.libファイルを追加する必要がある場合があります。

65
Mark Ransom

サードパーティのDLLをVS 2008 C++プロジェクトに組み込むために、次のことを行いました(2010、2012などに変換できるはずです)...

ヘッダーファイルを他のヘッダーファイルと共にソリューションに配置し、DLLの関数を呼び出すようにコードを変更しました(それ以外の場合、なぜこれを行うのですか?) :^)次に、ビルドを変更してLIBコードをEXEにリンクし、DLLを所定の場所にコピーし、「クリーン」を実行したときにクリーンアップします。これらの変更について以下に説明します。

2つのサードパーティDLL、A.DLLとB.DLLがあり、それぞれ(A.LIBとB.LIB)とヘッダーファイル(A.HとB.H)のスタブLIBファイルがあるとします。

  • ソリューションディレクトリの下に「lib」ディレクトリを作成します。 Windowsエクスプローラーを使用します。
  • サードパーティの.LIBファイルと.DLLファイルをこのディレクトリにコピーします

(使用するソースビルドターゲット(デバッグ、リリース)ごとに、次の一連の変更を行う必要があります。)

  1. EXEをLIBファイルに依存させる

    • [構成プロパティ]-> [リンカ]-> [入力]-> [追加の依存関係]に移動し、スペースA.LIB B.LIBで区切って、一度に1つの.LIBファイルをリストします。
    • [構成プロパティ]-> [全般]-> [追加のライブラリディレクトリ]に移動し、「lib」ディレクトリを既存のディレクトリに追加します。エントリはセミコロンで区切られます。たとえば、既に$(SolutionDir)fodderがある場合は、$(SolutionDir)fodder;$(SolutionDir)libに変更して「lib」を追加します。
  2. DLLを強制的に出力ディレクトリにコピーさせます

    • 構成プロパティ->ビルドイベント->ビルド後イベントに移動します
    • コマンドラインに次の行を入力します(スイッチの意味については、DOSウィンドウの「XCOPY /?」を参照してください)。

    XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y

    • 説明には次のように入力できます。

    Copy DLLs to Target Directory

    • ビルドから除外はNoである必要があります。 OKをクリックします。
  3. VSに出力フォルダーをクリーンアップするときにDLLをクリーンアップするように指示します。

    • [構成プロパティ]-> [全般]-> [クリーン時に削除する拡張機能]に移動し、[...]をクリックします。リストの最後に*.dllを追加し、OKをクリックします。
62
rich p

これらは、WindowsでDLLファイルを使用する2つの方法です。

  1. ヘッダーファイルが関連付けられたスタブライブラリ(.lib)があります。実行可能ファイルをlibファイルにリンクすると、プログラムの起動時にDLLファイルが自動的にロードされます。

  2. DLLを手動でロードします。これは、一般的なインターフェイスを実装するDLLファイルが多数あるプラグインシステムを開発している場合に通常行うことです。詳細については、 LoadLibrary および GetProcAddress のドキュメントをご覧ください。

Qtの場合、プロジェクトに含めてリンクできるヘッダーと静的ライブラリがあると思います。

24
Laserallan

動的リンクでQtを使用するには、「デバッグ」設定でlibファイル(通常はqtmaind.libQtCored4.libおよびQtGuid4.lib)を指定する必要があります
Properties » Linker » Input » Additional Dependencies

また、ライブラリが存在するパスを指定、つまり
Properties » Linker » General » Additional Library Directories

また、対応する.dllsを実行時にアクセスできるようにする必要があります。これは、.exeと同じフォルダー、またはパス上のフォルダーに保存する必要があります。

6
drby

バインドを遅延させ、実行時にインポートされた関数のみを解決する場合にのみ、LoadLibraryを使用する必要があります。サードパーティのdllを使用する最も簡単な方法は、.libにリンクすることです。


編集への返信:

はい、サードパーティのAPIは、必要なタイプを宣言する実装ファイルとヘッダーファイルを含むdllやlibで構成する必要があります。どの方法を使用する場合でも、タイプ定義を知る必要があります。LoadLibraryの場合は、関数ポインターを定義する必要があるため、代わりに独自のヘッダーファイルを簡単に作成できます。基本的に、遅延バインディングが必要な場合にのみLoadLibraryを使用する必要があります。これの1つの正当な理由は、dllがターゲットPCで使用可能かどうかわからない場合です。

3
Stu Mackellar

使用できるようにサポートされている場合、サードパーティのライブラリには* .libファイルと* .dllファイルが必要です。プロジェクトの「リンカー」オプションの入力ファイルのリストに* .libを追加するだけです。

この* .libファイルは、必ずしも「コード」を含む「静的」ライブラリではありません。代わりに、*。libは、実行可能ファイルをDLLにリンクする単なるファイルにすることができます。

2
ChrisW