【问题标题】:Linking problems with storage class defined as static将问题与定义为静态的存储类相关联
【发布时间】:2013-03-16 14:45:22
【问题描述】:

关于 .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 文件

使用我在SWC_Base 上定义的static struct Mouse mouse 我得到链接错误

我通过在这个文件上重新定义它来解决我的问题

//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 项目正在增长,上面有静态变量。

【问题讨论】:

  • 但是您是否与SWC_Base.cpp链接
  • 是的,除了 mouse 让我遇到链接问题。我花了一天时间才弄明白。
  • 这不是实际代码。我什至不会编译。
  • @harper 这是一千行代码。如果我把它放在这里,每个人都会感兴趣吗?
  • 您对一个现已删除的答案发表了评论,称您“使用宏正确链接它”。你是什​​么意思?宏是预处理器的东西,与链接器无关。请创建一个SSCCE 并向我们展示。

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


【解决方案1】:

如果您的调用代码将使用__declspec (dllimport),这个麻烦就会消失:)

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

【讨论】:

  • 我应该把它放在哪里?在 .h 文件还是在 .exe 文件中?
  • 编辑了我的答案,这应该在头文件中
  • 这也是我的实际代码。只是懒得把它都放在这里。我什至不知道我的代码是这样还是它的修改,也许。
  • 看看 Joachim Pileborg 的话 :) 如果您的 消费/应用程序 代码包含 __declspec (dllexport),我们需要一个 SSCCE 来提供帮助(正如我从您的 sn-p 中了解到的 .. .) 您还必须在 exe 文件中初始化您的静态成员
  • 你能确定当你编译你的 exe 时,SWC_CALL 宏的值是 __declspec (dllimport) 吗?我的预感是 ifndef 部分也适用于您的 exe 构建
【解决方案2】:

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

要解决这个问题,你可以

  • 将声明、定义和所有使用移到一个源文件中
  • 使用命名空间

【讨论】:

  • 我只是忘记在头文件中命名命名空间“SWC”。必须编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 2014-04-06
  • 2011-03-03
  • 2016-10-02
  • 1970-01-01
相关资源
最近更新 更多