【发布时间】: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_instance 是 nullptr,因此代码创建了一个新的 Marina 并使 marina_instance 指向它。这很好。
在main() 的第二行,代码输入query_marina() 并从那里进入Marina::get_marina()。此时marina_instance 是nullptr,这不是我想要的。我希望它保持之前的非空值。
我在类似代码中看到了一些解决问题的示例,但它们似乎不适用于我的情况。有关如何解决此问题的任何建议?
谢谢。
【问题讨论】:
标签: c++ windows dll global-variables