我有一个Visual Studio解决方案,其中某些“插件”类向工厂类注册,以便可以通过名称创建“插件”。这些插件与工厂一起驻留在静态库项目中。
注册通过易失性静态注册模板类进行,每个模块都在自己的插件编译单元中(因此注册过程由每个插件“完成”,并且没有可用插件的中心信息),如:
volatile static StaticPluginRegisterHelper<PluginClass> s_register;
但问题是如果PluginClass没有在代码中的其他地方逐字使用,链接器会选择优化代码,即上面的静态执行。
在我看来,这似乎是一个编译器或链接器错误,因为我已经明确告知静态是易失性的(即“请勿触摸!”):)
显然,解决方法是将上面的注册移动到我知道总是包含在内的编译单元,这当然有效。然而,它不是那么整洁。
想法?
答案 0 :(得分:0)
链接器不关心volatile
。如果它得出的结论是符号未被引用,那么它将成为驱逐的候选者。要强制引用其他未引用的符号,可以添加/INCLUDE
链接器选项。这也可以使用#pragma comment(linker,"/include:_s_register")
嵌入到您的源代码中。 - IIns 23月11日13:11