2009-07-14 10 views
13

私はC++を初めて使用しています。 C#では、たとえばlog4netという外部ライブラリを使いたい場合、log4net DLLへの参照を追加するだけで、メンバーは自動的に(IntelliSenseで)利用できます。管理されていないC++でどうすればよいですか?C++で「参照を追加する」方法

答えて

23

多くの場合、ライブラリには、1)ヘッダーファイル(.h)と2).dllに加えて.libファイルが付属しています。

ヘッダーファイルは、コード内に#includeされており、ライブラリの型宣言と関数宣言にアクセスできます。

.libはアプリケーションにリンクされています(プロジェクトプロパティ - >リンカー - >入力、追加の依存関係)。

.libファイルには通常、dllを自動的にロードして関数呼び出しを転送する単純なスタブが含まれています。

.libファイルがない場合は、LoadLibrary関数を使用してDLLを動的にロードする必要があります。

+0

私の答えよりも徹底的に。また、LoadLibraryを使用している場合は、単純に関数を名前で呼び出すことはできません。レイトバインディングを行う必要があります。 –

+1

私はもう一度不完全であるのを見る。 LoadLibraryはGetProcAddressに渡すことができるハンドルを返します。これにより、実際のポインタが得られます。 FreeLibraryを呼び出してアンロードすることもできます。 (私は先に行って私の元の答えを削除した。) –

+0

@Steven:もし彼がLoadLibraryを使う必要があれば、私は彼に出発点を与えてくれるだろうと思った。 – jalf

0

最初に行う必要があることは、そのライブラリで使用できる機能を説明するヘッダーファイルを#includeすることです。

ライブラリのための実際のコードは2ヶ所のいずれかであろう:方法に応じ

  1. スタティックライブラリ(.LIB)
  2. DLL(.dllファイル)

をライブラリのコードが.libファイルまたは.dllとして指定されている場合、次のいずれかを行う必要があります。

  • #pragma comment(lib、 "libraryname.lib")ifそのAの.lib
  • LoadLibrary

.dllはそのaが時々パッケージはあなたにリンクする必要があるの.libファイル、および.dllファイルBOTHが付属しています。この場合、LoadLibraryを呼び出す必要はありません。#pragma comment(lib、 "libaryfile.lib")が必要なのは、.libが.dllにリンクするためです。

非常に重要な詳細は、アプリケーションで見つけられる場所にDLLを配置することです。 Charles Petzold氏は、

を必要とするプログラムを実行する前にDLLモジュールをロードする必要がある場合、ライブラリファイルは、.EXEプログラム、現在のディレクトリ、Windowsシステムディレクトリ、 Windowsディレクトリ、またはMS-DOS環境のPATH文字列を介してアクセス可能なディレクトリ。 (ディレクトリの順に検索されます。) Programming windows, 5th ed MSDN

あなたがにリンクしているライブラリどのように表示されていないので、私はリンクするプロジェクトのプロパティ]メニューを使用することはお勧めしません。

See also

+0

これは質問に答えません。 –

+0

これは今質問に答えますが、正しくはありません。 jalfが指摘しているように、通常はimport libにリンクします(プラグマを使用するか、そうでない場合はlib.exeが起動するコマンドラインに追加します)。 LoadLibraryの使用は、後でバインドする方法です。 –

4

C++は、あなたが考えている意味でのライブラリを持っていません。それには#includeというヘッダーファイルがあり、リンカーが扱うライブラリと呼ばれる、コンパイルされたコードを含むものがあります。リンカ設定にライブラリ(.LIBファイル)を追加する必要があります。

Windowsの場合、DLLを使用している場合、理想的にはDLL用のインポートライブラリと呼ばれる.LIBファイルがあり、その.LIBファイルをリンカ設定に追加する必要があります。

9

基本的なコンセプトは次のとおりです。 スタティック&ダイナミックの2種類のライブラリがあります。それらの違いは、リンクビルドステップ中の静的ライブラリがコンパイルされたコードを実行可能ファイル(またはDLL)に埋め込むことです。動的libsは、関数へのポインタと、programmがロードされるときにロードされるべきdllの命令を埋め込むだけです。これはリンカによって実現されます。

ここで、どちらを使用するかを決めることができます。 DLLには多くのメリットとデメリットがあります。巨大なアプリケーションを開発する場合は、静的ライブラリの代わりにDLLを使用することを検討する価値があります。いくつかのlibsは単にDLLとしてあなたに渡され、あなたは選択肢がありません。とにかく、初心者のための最も簡単な方法は、静的ライブラリを使用することです。 DLLを扱うときには、実行時に(デバッガを使用していても)確実に見つけ出さなければならないので、展開とテストがずっと簡単になります。これは、すべてを1つのディレクトリにコピーするか、パス変数を扱うことです。

通常、DLLプロバイダ(ライブラリを処理できるようにする必要がある場合)は、ヘッダファイルと目的のDLLへの呼び出しを含む.libを提供します。一部のベンダー(例えば、boost)はヘッダファイルをインクルードする必要があり、libは実行可能ファイルに自動的にリンクされます(コンパイラprorietaryプラグマディレクティブで実現できます)。そうでない場合は、C++プロジェクトのプロジェクト設定(プロジェクトプロパティ/構成プロパティ/リンカ/入力)に移動し、libファイル名を「追加の依存関係」の行に入力する必要があります。 iced.lib iceutild.lib。そこには、完全修飾パス名を入れることもできます。両方の設定(Debug、Release)のlibファイル名を入力する必要があることに注意してください。これは、静的ライブラリとDllで同等に行う手順です。唯一の違いは、DLLはあなたのapp-directoryかpath-directoriesのどちらかにDLLを必要とすることです。

互換性のないライブラリをリンクしようとすると、コンパイルエラーが発生することがあります。なぜ両立できないのかは、多くの理由があります。しかし、最初にこの方法でlibをリンクし、動作するかどうかを確認してください。そうでない場合は、ここにエラーを再投稿してください;)

インクルードファイルは、smthを使用したい場所にインクルードされています。 libから。これをインクルードすれば、シンボルは別の(コンパイルされた)コンパイル単位(コンパイルされたcpp-file =>オブジェクトファイル)または.libから来なければならないことがコンパイラによって認識されます。それはルックアップを行い、必要なシンボルが見つからない場合に通知します。

グッドラック、
Ovanes

P.S.これは最初は難しいかもしれませんが、それに慣れると簡単になります。

関連する問題