2011-07-26 11 views
2

私は、Visual Studio 2003 .NET一部のヘッダーファイルでは、Visual Studioでライブラリをリンクする必要があるのはなぜですか?

I #include <winsock2.h>ヘッダファイルにソケットプログラムを構築するだけでなく、私は未解決のWinsock関数エラーを修正するWS2_32.libにリンクしなければならなかったことに気づいたんです。

他の宿題プロジェクトでは、ヘッダファイルを追加して、対応するライブラリを追加せずにその機能を使用しました。

これはどのようにですか?

いくつかの標準ヘッダーファイルライブラリは、Visual Studioなどで事前にリンクされていますか?

ありがとうございました!

答えて

7

実際にソケット機能はws2_32.dllに実装されています。リンカーがそれらを見つけることができるようにするには、ws2_32.libインポートライブラリをプロジェクトに追加する必要があります。インポートライブラリには関数の実際のコードは含まれておらず、実際の関数を見つける場所に関する情報(ws2_32.dll)のみが含まれています。

あなたが参照している他のヘッダファイルについては言及していませんが、<string.h>のようなものであれば、すでにMSVCランタイムライブラリに入っています。 のようなものであれば、これらの関数はkernel32.lib,user32.libgdi32.libなどのインポートライブラリによって提供されます。これらのライブラリはおそらくすでにリンカの設定に含まれています。

+0

ありがとう、私は、インポートライブラリに実際のコードが含まれているのではなく、実際の機能を見つけるための情報だけを知っていませんでした。はい、他の一般的なヘッダーの例は、リストしたものです。 –

+2

これには、インポートライブラリとスタティックライブラリの2種類のライブラリ '.lib'拡張があります。静的ライブラリ*は関数の実際のコードを含み、関連する '.dll 'はありません。 –

+0

は、同じ.libをリンクすることも、通常はどちらか一方にリンクすることもできますか? –

6

デフォルトでは、Visual Studioには最も一般的に使用されるWin32 .libファイルが含まれています。 kernel32.lib、user32.lib、advapi32.libなど。より難解なライブラリの場合は、.libファイルを自分で追加する必要があります。

2

デフォルトでは、Visual Studioは標準ライブラリとリンクします。そのため、ヘッダーを含める場合は、ライブラリを明示的に追加する必要はありません。これは、stdio.h,iostreamstdlib.hなどの場合に当てはまります。

標準テンプレートライブラリで使用されているようなヘッダーファイルもあります(誰かが実際に '標準ライブラリ'と呼ばれていると言いますが、ほとんどの書籍は読んでいます)。 <vector><list>などのMicrosoftのドキュメントもSTLを参照しています)。すべてのコードをテンプレートとして定義し、ライブラリ内でリンクする必要がないようにコンパイラによって完全な機能に展開されます。

ちょっとだけ:ライブラリと自動的にリンクするメカニズムもあります。次のコードを追加してください:

#pragma comment(lib, "ws2_32.lib") 

あなたのコードのどこかに追加してください。 Boostはこのテクニックを使用して、コンパイラsettinsgに応じてライブラリの正しいビルドとリンクします。

+0

私は...... –

2

これはVisual Studioとは関係ありません。これがC/C++のコンパイル方法です。

すべてのヘッダーは、シンボルを宣言または定義しています。関数、変数、typedef、クラスなど

ヘッダを言うことができる:

int SomeFunction(); 

これは、関数宣言です。 SomeFunctionを使用するコードをコンパイルするには、SomeFunctionが存在することを宣言する必要があります。そして、この宣言はの前にのコードを使用する必要があります。

これらの宣言は、通常、ヘッダファイルにあります。

しかし、宣言も約束です。関数定義は、関数を動作させる実際のC/C++ソースコードです。宣言は、「後で、あなたはこれの定義を見つけることができるだろう」と述べている。これはコンパイラとリンカーに約束していることです。

使用中のすべての宣言がの定義でない限り、C/C++コードを正常にリンクすることはできません。これらの定義の中には、自分のコンパイルされたコードに由来するものもありますが、その一部は外部ライブラリからのものです。外部ライブラリには、のC/C++関数、型などの宣言を提供するヘッダーファイルがありますが、これらの関数の定義を提供するライブラリファイル(VC++では.lib拡張子を使用します)もあります。

の定義のシンボルを提供するライブラリファイルにリンクせずにヘッダから宣言を使用すると、リンカエラーが発生します。

ヘッダーファイルには定義も含めることができます。 C++の標準ライブラリの多くはBoostのものであり、ヘッダファイルのみで定義されています。したがって、含めるライブラリはありません。ライブラリのドキュメントには、リンクする.libがあるかどうかが分かるはずです。

+0

非常に良い情報、ありがとう。 –

関連する問題