static変数から問題解析をエクスポート_declspec(dllexport)と_declspec(dllimport)の役割

2962 ワード

この間tinyxmlを静的ライブラリから動的ライブラリにするには_declspec(dllexport)と_declspec(dllimport)を使用してdllファイルとlibファイルをエクスポートします.やっとexportとimportの役割が分かったので、使用の観点から彼らの機能を説明します.
まず、ヘッダファイルはC++のインタフェースファイルであり、本プロジェクトではヘッダファイルを使用してコンパイルする必要があるだけでなく、他のプロジェクトにdllを提供する場合も、このdllのヘッダファイルを提供してこそ、他の人がプログラミングでdllを使用することができることを知っておく必要があります.頭のファイルは自分で使うべきで、他の人に使うべきだと覚えておいてください.
たとえば、あるアイテムのClassに静的変数が含まれていて、dllを生成するときに__しか採用されていません.declspec(dllexport)は以下の通りです.
dllエンジニアリング
A1.h:
  #define OS_API_EXPORT __declspec(dllexport)

  class OS_API_EXPORT A {static int a;}

 
A.cpp:
  #include “A.h”

  static A::a=0; //           cpp   

 
そうするとdllエンジニアリングをコンパイルするときは問題ありませんが、dllとヘッダファイルを他の人に提供して使うと「unsloved symbol a」という問題が発生します.
静的メンバーがimportでなければ、コンパイラによってlibファイルから見つからないからです.
dllを使用するエンジニアリングでは、dllのcppファイルの初期化プロセスを無視して、dllに関連するヘッダファイルもコンパイル対象に入れられるため、aが定義されていない場合があります.
__declspec(dllimport)      ,      dll    lib            。        dll       :

A2.h:
  #define OS_API_IMPORT __declspec(dllimport)

  class OS_API_IMPORT A {static int a;}

 
A.dllを使用するエンジニアリングリンク上のA 2.h後、「unsloved symbol a」の問題は発生しません.
最終的にプログラムの開発を容易にするために、dllエンジニアリングのヘッダファイルとdllエンジニアリングを使用するヘッダファイルを別々に書く必要はありません.ヘッダファイルは以下の形式で書くことができます.
A.h
    #define OS_API_IMPORT __declspec(dllimport)
      #define OS_API_EXPORT __declspec(dllexport)

      #ifdef BUILD_DLL
      #define OS_API OS_API_EXPORT //     dll  ,    
      #else
      #define OS_API OS_API_IMPORT //       dll   ,    
      #endif 

      class OS_API A{static int a;}

同時にdllエンジニアリング属性の下でプリプロセッサ定義BUILDを設定することを忘れないでください.DLL
      7    http://topic.csdn.net/u/20070522/10/a6dff1ea-262f-4878-879f-61f36b74ec8b.html

転載先:https://www.cnblogs.com/darknightsnow/archive/2012/09/25/2701389.html