0

私は MSVC++ 2010 で DLL を作成する経験があまりありません。学習曲線の一部として数回だけかもしれません。現時点では、約 10 の異なるクラスを含む非常に大きなファイルがあります。ファイルを複数のファイルに分割し、関連するクラスを同じファイルに移動する必要があります。そのため、先に進む前に、経験豊富な開発者から私の状況について知りたいと思っていました。

次のようなもの

// Header
namespace collections
{
 classA
 classB
 ClassC
 ClassD : ClassA,ClassB
}
// CPP
namespace collections
{
 classA
  {
      // Implementations
  }
 // Rest of the classes
}

個別のファイルに分解した後

// ClassA.h
namespace Collections
{
  ClassA
}

// ClassB.h
namespace Collections
{
  ClassB
}

// Implentations etc

私の主な関心事は、dllexport/dllimport ストレージ クラス属性の使用です。ファイルが分割されるため、次を使用する必要があります。

#ifdef MAKEDLL
#  define EXPORT __declspec(dllexport)
#else
#  define EXPORT __declspec(dllimport)
#endif

それらをエクスポート/インポートするクラスに対して。しかし、これらの行を作成する各ヘッダーファイルに配置すると(1つの名前空間「コレクション」)、これはコンパイルまたはコード生成ステップで悪い意味を持ちますか?私はオンラインで周りを見回していて、特定のメンバーが再定義されているか、DLLの作成中に見つからないリンカーのエラー/警告について人々が最も不満を言うことを発見しました。これは、どちらがそれを行うのに最適かつ適切な方法であるかわからないということだけで、間違いなく解決された問題でなければなりません。最後に1つのDLLだけを作成する必要があります。複数のDLLを作成する必要はありません。

ガイダンスやヘルプをいただければ幸いです。ありがとうございました

4

1 に答える 1

2

EXPORTSマクロを定義する共通のヘッダー ファイルを 1 つ持つことに問題はありません。

mydll.h

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

そして、このヘッダー ファイルを他のヘッダー ファイルに含めます。

ClassA.h

#include "mydll.h"
namespace Collections
{
  class MYDLL_API ClassA {
    // ...
  }
}

ClassA.cpp

#include "ClassA.h"
// ...

ClassB.h

#include "mydll.h"
namespace Collections
{
  class MYDLL_API ClassB {
    // ...
  }
}

... 等々。DLL プロジェクト設定で定義すると、それらすべて (ヘッダー ファイルと .cpp 実装ファイル) を 1 つの DLL にMYDLL_EXPORTS含めることができます (これは VS2010 DLL ウィザードによって自動的に行われます)。

ここには奇妙なことは何もありません。何も再定義することはありません。ハンディMYDLL_APIを使用して、すべての DLL API クラスにデコレータを追加するだけです。

于 2013-06-28T07:10:10.980 に答える