c++ - 强制构造一个全局对象
问题描述
这是代码:
struct S
{
S()
{
__debugbreak();
}
};
static const S g_s;
显然,我希望一些代码在启动时运行。
这仅适用于具有外部代码引用的符号的某些源文件。对于静态库中没有从外部引用的任何符号的源文件,看起来编译器或链接器会删除完整的编译单元,因此不会构造全局对象。
有没有办法强制构造静态对象,或者在启动时强制运行代码?
我已经仔细检查了这些源文件的编译设置,它们是相同的,并且它们在同一个静态库项目中。
静态库由 DLL 使用。全局对象应在调用 DLL_PROCESS_ATTACH 之前构建。
解决方案
您将需要使用链接器选项链接此库中的“所有内容”,例如
-Wl--whole-archive -lmylib -Wl--no-whole-archive (gcc)
或者
/INCLUDE symbol (vc)
或者
/WHOLEARCHIVE:mylib (vc)
然而,依赖动态初始化阶段和/或在程序启动/dll加载期间对全局对象的状态做出假设会使您的程序注定失败。所以你应该考虑显式初始化。
推荐阅读
- python - 根据特定条件从python中的数据框中选择随机行
- javascript - 使用当前不支持的 applyConstraints 切换面临模式(媒体流 Api)
- python - 使用 virtualenvwrapper 在子文件夹中创建虚拟环境
- javascript - 无法读取未定义的 React js 的属性“函数名称”
- database - 一个 GET API 调用中应该嵌套多少数据?
- ansible-awx - Ansible AWX:playbook 成功运行以在 localhost 中创建目录,但是当转到该位置时,该目录不可用
- excel - 从网站查询选择器中提取链接全部
- javascript - 为什么 Node.js Express 项目中的 .Flash 和 .Redirect 不触发路由?
- python-3.x - 为什么我的单例实现在 Python 中不起作用?
- ios - 突出显示被按下的按钮并取消突出显示未按下的按钮 SWIFT