2010-11-19 10 views
2

私は初心者ですので、あまりにも些細なことがあれば、私と一緒に裸にしてください。私はこれをネットで検索したら、どうやって結果を得ているのですか?私の質問は、最初にそれをやる理由です。なぜクラスをC++でエクスポートする必要がありますか?

アトゥール

+1

もう少し詳しく教えてください。 –

+1

「クラスをエクスポートする」とはどういう意味ですか? –

+0

なぜ__declspec(dllimport)/ __ declspec(dllexport)クラスを実行する必要がありますか? – Atul

答えて

4

これは、C++ DLLを開発しているWindowsプラットフォームに特有のものです。

DLLのエクスポートされたシンボルリストにクラスとそのメソッドを表示するには、__declspec(dllexport)修飾子を使用する必要があります。

このように、DLLを使用する実行可能ファイルは、これらのクラスのメソッドをインスタンス化して呼び出すことができます。

しかし、C++シンボルは比較的複雑な名前のマ​​ングリングエンコーディング(depends.exeを使用して見ることができます)を使用してエクスポートされるため、同じコンパイラの同じバージョンで実行可能ファイルとDLLがコンパイルされていることを確認する必要があります。コンパイラによって異なります。

+0

はWindows固有のものではありません。 Symbian OSはdefファイルでエクスポートを使用します。 – Dynite

+0

@Dynite:dllexportはWindowsプラットフォーム専用です。 defファイルについては言及していませんでした。名前のマングリングの複雑さを考えると、完全なクラスのシンボルをエクスポートするのにはあまり適していないからです。 – SirDarius

+0

dllexportはありますが、エクスポートはできません。 – Dynite

2

あなたはDLLを作成している場合を除きあなたはは、何をエクスポートするは必要ありません。その場合、.defファイルを使用する「古い学校」の方法の代わりにdllexport属性を使用できます。

1

技術的には、クラスのみをエクスポートすることはできません。 しかし、クラスレベルでは、すべての関数をエクスポートすることができます。

関数をエクスポートすると、その関数を現在の実行可能ファイルの外部から呼び出すことができます。

これは、たとえば別のエンティティであるdllを作成する場合に必要です。

+0

これは正しくありません。 '__declspec(dllexport)'修飾子をクラスに置くことができます。この修飾子は、すべてのクラスの関数メンバの名前を変更して名前を付けてエクスポートします。 –

+0

-1、クラスはエクスポートできますが、これは間違っています。 –

+3

厳密に言えば、これは正しいです、あなたはクラスのみの関数をエクスポートすることはできません。ただし、クラスにマーキングすることで、クラス内のすべての関数をエクスポートするように指定できます。区別は微妙です。同意します:) – jcoder

関連する問題