我试图在C ++文件中初始化一个静态对象,该文件试图在其构造函数中将类自动注册到工厂(就像任何标准的自动注册问题一样)。问题是,这被编译为静态库,并且在链接到可执行文件时,它被优化掉了。应该有一个非常简单的解决方案,但令人惊讶的是,看起来并不那么简单。
这是我的班级:
在Factory.h(静态lib项目的一部分)
class DummyClass : public BaseFactoryClass
{
int mDummyInt;
public:
DummyClass()
{
std::cout << "Pretending to register myself to the factory here\n";
}
};
在一些cpp中,让我们说Circle.cpp(仍然是静态lib项目的一部分)
static DummyClass dum;
main.cpp(可执行文件的一部分)
//some code accessing the BaseFactoryClass of the Registered derived classes.
现在,由于静态对象没有在可执行项目中“直接”使用,因此它会从链接库中跳过。
我想让它在MS VC11(Visual Studio 2012)(以及GCC 4.8。*,但这是以后的)中工作。看看其他问题,我到目前为止尝试了各种各样的东西,似乎不起作用:
Visual Studio链接器设置中有一个标志,允许单独链接所有目标文件而不是静态库,但我不想走那条路。另外,我最好只想在我想要自动注册的每个类的源(.cpp)中写一些东西,所有的样板代码和宏都在像BaseFactory.h这样的中心标题中。有没有这样做的方法(即使在C ++ 11中,保证符号将被初始化)?想要为任何新开发人员尽可能简单地注册新类。
在MSVC中,您有一个可用于此目的的链接程序编译指示:
#pragma comment (linker, "/export:_dum")
这样,无论何时运行链接器,它都会在您的可执行文件或DLL中强制链接_dum
。
但是,更好的方法是考虑使用DLL而不是静态库。然后你完全避免这个问题,因为每次加载DLL都会初始化静态变量。