【问题标题】:Shared global variable with DLL not working与 DLL 共享的全局变量不起作用
【发布时间】:2021-08-15 00:03:56
【问题描述】:

我正在尝试让一些可在 Mac 上运行的代码在 Windows 上运行。该代码涉及在 DLL、静态库和主程序之间共享数据。我怀疑问题的出现是因为 Unix 和 Windows 处理全局变量的方式不同(例如,参见the answers here)。但是,我还没有想出如何解决它。这是一个最小的例子:

我的 Visual Studio 2019 解决方案包含三个项目。

项目1制作静态库MarinaLib.lib

头文件是 MarinaLib.h

    #pragma once
    #include "Marina.h"

类头是 Marina.h

#pragma once

class Marina
{
public:
    static Marina* get_marina();

protected:
    static Marina* marina_instance;
};

源文件是 Marina.cpp

#include "Marina.h"

Marina* Marina::marina_instance { nullptr };

Marina* Marina::get_marina()
{
   if( !marina_instance )
      marina_instance = new Marina();
   return marina_instance;
}

项目 2 生成 DLL MarinaDLL.dll 。它#defines MARINADLL_EXPORTS

第一个源文件 dllmain.cpp

// dllmain.cpp : Defines the entry point for the DLL application.
#include "framework.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

头文件 MarinaDLL.h 是

#pragma once

#ifdef MARINADLL_EXPORTS
#define QUERY_DECLSPEC __declspec(dllexport)
#else
#define QUERY_DECLSPEC __declspec(dllimport)
#endif

QUERY_DECLSPEC void query_marina();

第二个源文件是marinaDLL.cpp

#include "MarinaDLL.h"
#include "..\MarinaLib\Marina.h"

void query_marina()
{
   auto inst = Marina::get_marina();
}

项目 3 生成可执行的 MarinaExample.exe,但不生成 #define MARINADLL_EXPORTS。它在 MarinaLib.lib 和 MarinaDLL.lib 中链接

源文件 MarinaExample.cpp 是

#include "MarinaLib.h"
#include "MarinaDLL.h"

int main()
{
   auto instance = Marina::get_marina();
   query_marina();
}

main()的第一行代码输入Marina::get_marina()marina_instancenullptr,因此代码创建了一个新的 Marina 并使 marina_instance 指向它。这很好。

main() 的第二行,代码输入query_marina() 并从那里进入Marina::get_marina()。此时marina_instancenullptr,这不是我想要的。我希望它保持之前的非空值。

我在类似代码中看到了一些解决问题的示例,但它们似乎不适用于我的情况。有关如何解决此问题的任何建议?

谢谢。

【问题讨论】:

    标签: c++ windows dll global-variables


    【解决方案1】:

    将导出修饰符添加到类定义并导出整个类。

    在 dll 和 lib 构建中定义 QUERY_DECLSPEC=export ,在 exe 构建中定义为 import :

    class QUERY_DECLSPEC Marina
    {
    public:
        static Marina* get_marina();
    
    protected:
        static Marina* marina_instance;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2011-06-22
      相关资源
      最近更新 更多