0

我有一个 Visual Studio 解决方案,其中某些“插件”类向工厂类注册,以便可以按名称创建“插件”。这些插件与工厂一起驻留在静态库项目中。

注册通过一个 volatile 静态注册模板类进行,每个模板类都在其自己的插件编译单元中(因此注册过程由每个插件“完成”,并且没有可用插件的中心信息),例如:

volatile static StaticPluginRegisterHelper<PluginClass> s_register;

但问题是,如果 PluginClass 没有在代码的其他地方逐字使用,链接器会选择优化代码,即上面的静态永远不会被执行。

在我看来,这就像一个编译器或链接器错误,因为我已经明确指出静态是易失的(即“不要触摸!”):)

解决方法显然是将上面的注册移动到我知道总是包含的编译单元,这当然有效。然而,它并不那么整洁。

想法?

4

1 回答 1

0

链接器不关心volatile. 如果它得出一个符号未被引用的结论,它将成为驱逐的候选者。要强制引用其他未引用的符号,您可以添加/INCLUDE链接器选项。这也可以嵌入到您的源代码中,也可以使用#pragma comment(linker,"/include:_s_register"). – IInspectable 2 月 23 日 13:11

于 2014-06-27T11:33:29.500 回答