0

.dll ファイルについて

//SWC.h

#ifndef _SWC_
#    define _SWC_
#    define SWC_CALL __declspec(dllexport)
#else
#    define SWC_CALL __declspec(dllimport)
#endif

namespace SWC
{

    struct SWC_CALL Mouse
    {
        //interface
    };

    class SWC_CALL SWC_Base : public someClass1, public someClass2
    {

        static Mouse mouse;

    };

    //other classes goes here...
}

//SWC_Base.cpp
namespace SWC
{

    Mouse SWC_Base::mouse; //needed, to compile

    //other SWC_Base function definition

}

.exeファイルについて

static struct Mouse mouse定義した でSWC_Baseリンク エラーが発生する

このファイルで再定義することで問題を解決します

//main.cpp

#include "SWC.h"

#pragma comment (lib, "..\\SWC")

SWC::Mouse SWC::SWC_Base::mouse; //<- why do I need to redefine it again?

int main()
{
    //...

    return 0;

}

.cpp ファイルで SWC_Base::mouse を既に定義していますが、それを使用するファイルで再度定義する必要があるのはなぜですか? 私の.dllプロジェクトは静的変数で成長しているため、これ以上の問題が発生する可能性があることはわかっています。

4

2 に答える 2

1

呼び出しコードが__declspec (dllimport)この問題を使用する場合、問題はなくなります:)

#ifdef EXPORTING_SWC
  #define SWC_CALL __declspec(dllexport)
#else
  #define SWC_CALL __declspec(dllimport)
#endif
于 2013-03-16T15:01:37.103 に答える
0

namespace { }ヘッダー ファイルに (実際のコードを投稿した場合に備えて) 定義の周りに匿名を追加しました。各匿名名前空間は、コンパイラによってコンパイル ユニット固有の名前空間に変換されます。したがって、常に新しい名前空間で新しいクラスを取得します。

問題を解決するには、次のいずれかを実行できます

  • 宣言、定義、およびすべての使用を 1 つのソース ファイルに移動する
  • 名前付き名前空間を使用する
于 2013-03-17T19:22:08.243 に答える