2011-06-06 14 views
2

私はVisual C++ 2010のプロジェクトを持っています。このプロジェクトには、キーヘッダーファイルにプリプロセッサディレクティブが含まれています。実際、ZMQのソースコードです。DLLを静的ライブラリにコンパイルするときに、DLL_EXPORTをどうやって処理できますか?

プロジェクトは通常dllに設定されているため、ヘッダはDLL_EXPORTのステータス(定義済み/未定義)を使用します。プロジェクトは、DLLをコンパイルするために使用されている場合は、ヘッダーがDLLプロジェクトやクライアントコードの両方で使用することができ、zmq.hから取った次のセットアップのおかげ:

#if defined _WIN32 
# if defined DLL_EXPORT 
#  define ZMQ_EXPORT __declspec(dllexport) 
# else 
#  define ZMQ_EXPORT __declspec(dllimport) 
# endif 

はしかし、これはサポートしていません。私はスタティックライブラリを構築しています。したがって、手作業でヘッダーに変更する必要があります。 Visual Studioはdllプロジェクトのセットアップを認識し、それに応じてdll_exportの定義を処理するようです。ビジュアルスタジオで認識されているシンボルはありますか?スタティックライブラリの設定に対応していますか?基本的には、上記のスニペットで使用されているメソッドを拡張して静的ライブラリのコンパイルと使用法を扱いたいと思います。

+0

私はそれが助けになるとは思わない。 Visual Studioでは、 '_declspec(dllimport)'(MSVC * .DLLへのリンク用)と空白(静的CRTへのリンク用)を切り替えるだけで済みます。 – Neil

答えて

8

私はちょうど秒(オプション)マクロを導入する、ZMQ_STATICのようなもの:

#if defined(ZMQ_STATIC) 
# define ZMQ_EXPORT 
#elif defined(DLL_EXPORT) 
# define ZMQ_EXPORT __declspec(dllexport) 
#else 
# define ZMQ_EXPORT __declspec(dllimport) 
#endif 

定義は、マクロが静的ライブラリとしてあなたのライブラリーを構築するときまたは静的ライブラリとして、それを消費したときに両方と述べました。

2

__declspec(dllimport)は完全にオプションです。 DLLをビルドすると、リンカは静的インポートライブラリも作成します。

クライアントコードを__declspec(dllimport)なしでコンパイルすると、fat静的ライブラリまたは静的インポートライブラリのいずれかと互換性があります。リンカーはそれをすべて理解します。

だから私はお勧め:

# if defined DLL_EXPORT 
#  define ZMQ_EXPORT __declspec(dllexport) 
# else 
#  define ZMQ_EXPORT extern 
# endif 

@vanzaが指摘するように、あなたが任意のデータのエクスポートを(あなたは自明アクセサ関数でそれらをラップすることができます)を除去する必要があります。とにかくそれを行うべきです、データの輸出は壊れやすいです。


注:わずかに速い関数呼び出しで__declspec(dllimport)結果、それはDLLを呼び出すパフォーマンスの非常に小さな増加対静的ライブラリを使用するための柔軟性の間のトレードオフです。

+0

__declspec(dllimport)は、関数ではオプションですが、データエクスポートでは使用できません。 – vanza

+0

@vanza:正しいですが、DLLからエクスポートされたデータは非常にまれです。それは他の方法でも壊れやすい。 –

+0

dllimport *は、関数名fを__imp_fに変更します。 dllexportは名前を変更しません。したがって、通常の静的ライブラリから関数f()を使用して、インポートライブラリから取得するには__imp_f(__declspec(dllimport)によって生成される)が必要です。つまり、オブジェクトファイルをリンクするときに通常の静的ライブラリとインポートライブラリの両方を提供することができます。どちらが使用されるかは、オブジェクトファイルによって異なります。 – Yttrill

関連する問題