强制构造全局对象

时间:2019-01-05 19:43:48

标签: c++ visual-studio-2017

这是代码:

struct S
{
    S()
    {
        __debugbreak();
    }
};
static const S g_s;

很显然,我希望一些代码在启动时运行。

仅对某些源文件具有外部代码引用的符号有效。对于静态库中没有从外部引用任何符号的源文件,看起来编译器或链接器会删除完整的编译单元,因此不会构造全局对象。

是否有一种方法可以强制构造静态对象,或者以其他方式强制在启动时运行代码?

我仔细检查了这些源文件的编译设置,它们是相同的,并且它们在同一静态库项目中。

静态库由DLL使用。全局对象应在DLL_PROCESS_ATTACH调用之前构造。

1 个答案:

答案 0 :(得分:1)

您将需要使用链接器选项(例如,

)将此库中的“所有内容”链接起来
-Wl--whole-archive -lmylib -Wl--no-whole-archive (gcc)

/INCLUDE symbol (vc)

/WHOLEARCHIVE:mylib (vc)

但是,依赖于动态初始化阶段和/或在程序启动/ dll加载期间对全局对象的状态进行假设会使您的程序注定要失败。因此,您应该考虑使用显式初始化。