将问题与定义为静态的存储类相关联

时间:2013-03-16 14:45:22

标签: c++ visual-c++ dll static linker

在.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项目会随着静态变量的增长而出现更多问题。

2 个答案:

答案 0 :(得分:1)

如果您的主叫代码将使用__declspec (dllimport),则此问题将会消失:)

#ifdef EXPORTING_SWC
  #define SWC_CALL __declspec(dllexport)
#else
  #define SWC_CALL __declspec(dllimport)
#endif

答案 1 :(得分:0)

您在头文件中添加了一个任意namespace { }的定义(如果您发布了实际代码)。每个匿名命名空间都将由编译器转换为特定于编译单元的命名空间。因此,您总是在新的命名空间中获得一个新类。

要解决问题,您可以

  • 将声明,定义和所有用途移至一个源文件
  • 使用命名命名空间