【发布时间】:2014-05-22 04:11:25
【问题描述】:
我在 VS2010 中有静态库 (.lib) 并将其链接到我的测试项目。
该库有一个我使用以下 MACRO 创建的工厂:
#define REGISTER_FACTORY(mType, my_class) \
class Factory##my_class : public CAbstractFactory\
{\
public:\
Factory##my_class() : CAbstractFactory(mType){}\
CBaseClass *Create()\
{ return new my_class(); }\
};\
static Factory##my_class StaticFactory##my_class;
应该发生的是,在 CAbstractFactory 中,新工厂由mtype 注册。但是当我检查工厂时,工厂并不存在。
当我使用 DLL 而不是 .lib 时,它可以正常工作。我的猜测是链接器不包含静态变量,因为它没有被引用,或者静态变量甚至没有包含在库中。
如何强制链接器在我的 .exe 中包含静态库中的所有对象。
我是这样使用宏的:
// Register factory that can create CMyObject with ID=100
REGISTER_FACTORY(100, CMyObject);
class CMyObject
{
};
CAbstractFactory 如下所示:
class CAbstractFactory {
CAbstractFactory(int id) {
CFactory::instance().add(id, this);
}
}
然后是代码中的其他地方,我使用的主 .exe:
CBaseClass *pObject = CFactory::instance().Create(100);
这会给我一个新的CMyObject。这个想法是我有许多不同种类的对象,并且我有一个数据库,其中包含指定我需要的对象种类的 id。
100 只是一个例子。
确实,我没有直接从 .lib 中引用任何东西,但我希望能够使用我的工厂创建对象
CFactory 类是一个简单的类,它保存所有 CAbstractFactory 类的寄存器(在映射中)并将 create 方法委托给正确的工厂。
CFactory &CFactory::Instance()
{
static CFactory instance;
return instance;
}
主要问题在于我没有从 .lib 中引用任何内容,因为这一切都是通过 CFactory 完成的。如果我将其设为 DLL 并确保添加对该 DLL 的一些引用以确保它已加载,则它会起作用。但是对于 .lib,我什至添加了一个虚拟函数,以确保我至少有一个不包含其余代码的引用。
【问题讨论】:
-
这只是一个宏,希望你用在什么地方。
-
是的,我用它来为一系列对象创建工厂。我添加了更多细节。
-
显示
CFactory::instance()的定义(以及任何引用的内容)。看起来它可能正在返回对静态对象的引用 -
添加了CFactory::instance(),确实是静态的,但是CFactory在不同的DLL中。
-
“CFactory 存在于不同的 DLL 中” - 哦。我不确定其他 DLL 中的静态对象应该如何工作,希望其他人可以帮助您
标签: c++ visual-studio-2010 dll static-libraries static-members