我重写了这个问题,因为当我第一次问这个问题时,我意识到我不理解这个问题,这个问题变得非常混乱。
我在库中有一个Singleton-Pattern类(Meyers )。当我在我的主应用程序和库中的.cpp中调用getInstance()时,我得到了两个不同的地址。当我在Librarys头中调用getInstance()时,它的地址是相同的。
main.cpp
#include <GameEngine.h>
#include <iostream>
main() {
GameEngine& engine = GameEngine::getInstance();
std::cout << &engine; // gives me address A
engine.doSomething();
}现在,在Headerfile中调用getInstance时,它工作得很好:
内部库GameEngine.h
class GameEngine {
public:
static jglEngine& getInstance() // Singleton is accessed via getInstance()
{
static jglEngine instance; // lazy singleton, instantiated on first use
return instance;
}
void doSomething() {
GameEngine& engine = GameEngine::getInstance();
std::cout << &engine; // gives me also address A
}
private:
GameEngine() {};
GameEngine(GameEngine const&); // prevent copies
void operator=(GameEngine const&); // prevent assignments
}但是,当我没有将函数定义放在头文件中,而是放在源文件中时,它会给我一个不同的地址:
库GameEngine.cpp内幕
#include "GameEngine.h"
void GameEngine::doSomething() {
GameEngine& engine = GameEngine::getInstance();
std::cout << &engine; // gives me address B
}找到了解决方案:D
我把动态库改成了静态库,这样它就可以工作了。
发布于 2015-11-25 17:22:15
每个DLL都有自己的静态数据实例,这实际上是使用DLL的真正问题之一(但也可能是优势之一,取决于您的观点
有一些技巧可以克服这一点,例如使用线程区域存储,但通常您必须确保DLL传递给单例,可能是在主应用程序中创建单例,然后将其作为某种上下文对象进行传递。
https://stackoverflow.com/questions/27425046
复制相似问题