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

时间:2013-07-28 21:23:39

标签: c++ linux gcc

我正在尝试创建一个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()函数()。

1 个答案:

答案 0 :(得分:1)

如果这是第三方使用的库,我强烈要求手动调用这种“init”功能作为使用合同的一部分。否则,您的用户可能会发现他们处于非常不愉快的状态,他们会被您的lib的直线行为所束缚。

作为证据,有一个WinSock示例:在调用WSAStartup()之前,没有任何东西可以工作。