我正在尝试初始化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中,保证符号将被初始化)?想要为任何新开发者尽可能简单地注册新课程。
答案 0 :(得分:0)
在MSVC中,您可以使用链接器编译指示来实现此目的:
#pragma comment (linker, "/export:_dum")
通过这种方式,只要运行链接程序,它将强制链接_dum
在您的可执行文件或DLL中。
不过,更好的方法是考虑使用DLL而不是静态库。这样一来,您就完全避免了这个问题,因为在DLL的每次加载时,都会初始化静态变量。