首页 > 解决方案 > 强制构造一个全局对象

问题描述

这是代码:

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

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

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

有没有办法强制构造静态对象,或者在启动时强制运行代码?

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

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

标签: c++visual-studio-2017

解决方案


您将需要使用链接器选项链接此库中的“所有内容”,例如

-Wl--whole-archive -lmylib -Wl--no-whole-archive (gcc)

或者

/INCLUDE symbol (vc)

或者

/WHOLEARCHIVE:mylib (vc)

然而,依赖动态初始化阶段和/或在程序启动/dll加载期间对全局对象的状态做出假设会使您的程序注定失败。所以你应该考虑显式初始化。


推荐阅读