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

您已经在头文件中围绕您的定义添加了一个 anymous namespace { }(如果您发布了真实代码)。每个匿名命名空间都会被编译器翻译成编译单元特定的命名空间。因此,您总是在新命名空间中获得一个新类。

要解决问题,您可以

  • 将声明、定义和所有用途移至一个源文件
  • 使用命名空间
于 2013-03-17T19:22:08.243 回答