2009-07-07 11 views
5

ので、一般的な(少なくとも、VS 2005人の状態)の方法は次のとおりです。DLLと静的ライブラリの両方に同じヘッダーファイル

#ifdef MY_EXPORTS 
#define MY_API __declspec(dllexport) 
#else 
#define MY_API __declspec(dllimport) 
#endif 

class MY_API MyClass { 
    ... 
}; 

私はちょうど私を構築してる場合、これは素晴らしい作品DLLとしてのコード。しかし、静的ライブラリまたはDLLを使用するオプションが必要です。今明らかになっている(ひどい)解決策は、すべてのコードをコピーし、DLL 'MY_API'を削除することです。では、コマンドラインを使ってDLLを定義するか、定義しない方がよいでしょう。しかし、静的ライブラリの場合、「MY_API」は何をすべきでしょうか?

#ifdef DLL_CONFIG 
    #ifdef MY_EXPORTS 
    #define MY_API __declspec(dllexport) 
    #else 
    #define MY_API __declspec(dllimport) 
    #endif 
#else 
    #define MY_API // What goes here? 
#endif 

class MY_API MyClass { 
    ... 
}; 

は、今これは(すなわち。彼らは「DLL_CONFIG」を定義する必要があります)図書館の利用者は、ヘッダファイルが含まれている場合に問題があるだろうに行うことができると仮定しますか?

答えて

12

何もありません。

#define MY_APIのままにしておくと、MY_APIのインスタンスはすべて消滅します。

#define DLL_CONFIG以外のものを模倣するDebug-DLLやRelease-DLLなどの新しいビルド構成を追加できます。

構成を複製するには、構成マネージャー(「デバッグ/リリース」リスト・ボックスのドロップダウンなど)を開き、「アクティブなソリューション構成」で新規を選択します。これで "Debug - DLL"という名前になり、Copy SettingsDebugに設定することができます。ここでは、DLL_CONFIGを定義します。

これを行うには、プロジェクトのプロパティー - >構成プロパティー - > C/C++ - >プリプロセッサーに移動し、そこでDLL_CONFIGと入力します。また、NDEBUGWIN32のようなものが定義されています。

haffax saidのように、プロジェクト固有の名前を使用します。 「 - DLL」構成で持って、彼らはあなたが同じように、DLLのバージョンを使用している場合

#ifdef THEPROJECT_USE_DLL 
    #ifdef THEPROJECT_BUILDING_PROJECT 
     #define THEPROJECT_API __declspec(dllexport) 
    #else 
     #define THEPROJECT_API __declspec(dllimport) 
    #endif 
#else 
    #define THEPROJECT_API 
#endif 

あなたのDLLの今のユーザーだけ#define THEPROJECT_USE_DLL:私のようなものをお勧めします。

3

MY_APIを空白として定義するだけです。このように:

#ifdef DLL_CONFIG 
    #ifdef MY_EXPORTS 
    #define MY_API __declspec(dllexport) 
    #else 
    #define MY_API __declspec(dllimport) 
    #endif 
#else 
    #define MY_API 
#endif 

staticリンクの場合、declspecは必要ありません。

ライブラリーのユーザーは、DLLとして使用したい場合や、静的ライブラリーとして使用したい場合には定義しない場合は、DLL_CONFIGを定義する必要があります。 そのままの問題はありません。この種の設定は多くのライブラリで行われます。

編集:もちろん、MY_EXPORTSDLL_CONFIGという名前は使用しないでください。名前の衝突がないように、すべてのマクロにプロジェクト固有のプレフィックスを使用します。

1

何もしない。静的ライブラリとのリンクに特別な呼び出し規約は必要ありません。必要なのは、リンカがyour.libとリンクしていることを確認することだけです。

関連する問題