繁体   English   中英

如何确保在所有静态对象初始化(等效于DllMain)之后调用全局构造函数?

[英]How to make sure a global constructor is called after all static object initializations (DllMain equivalent)?

我正在尝试制作C ++库,并且需要在加载时调用一个函数来对其进行初始化。 我正在使用GCC,因此我尝试使用__attribute__((constructor)) ,并且该函数实际上是在加载时调用的。

但是前面提到的函数利用了位于不同翻译单元中的静态对象,因此,当我需要使用它们时,尚不确定这些翻译单元中的那些静态对象是否已初始化。 因此,例如,如果我想在此函数内使用std :: cout,那我就很无聊了。

以下代码片段很好地演示了该问题:

#include <iostream>

void __attribute__((constructor)) init()
{
    std::cout << "Test\n";
}

int main(int argc, char* argv[])
{
    return 0;
}

在这里,函数init()将在加载时调用,但目前尚不确定std :: cout是否已初始化,并且在尝试执行第5行时可能会出错。

所以我的问题是,是否可以确保在构造所有静态对象之后执行在加载时需要调用的初始化函数?

编辑:我忘了提起这个库,它将通过使用LD_PRELOAD环境变量将其预加载到另一个程序中来拦截某些调用,因此我不能要求用户在他的main()中调用lib_init()函数。

如果这将是供第三方使用的库,则我强烈要求将使用“ init”功能的手动调用作为使用合同的一部分。 否则,您的用户可能会发现它们处于非常令人不快的情况,被lib的愚蠢行为所束缚。

作为一个证据,有WinSock示例:在调用WSAStartup()之前,假定没有任何效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM