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

标签 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() 函数().

最佳答案

如果这将是供第 3 方使用的库,我强烈坚持要求手动调用此类“init”函数作为使用契约(Contract)的一部分。否则,您的用户可能会发现他们处于非常不愉快的境地,他们被您的库的直线行为所束缚。

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

关于c++ - 如何确保在所有静态对象初始化(等效于 DllMain)之后调用全局构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17913032/

相关文章:

c++ - 如何访问OpenCV图像的所有 channel

c++ - 如何遍历具有结构指针的 vector ?

c++ - 字符串 C++ 中的元音

linux - 每行选择一个值 - awk

Java/开发/输入/事件X

c - 未定义对 `yylval' 和 `yyerror` 的引用

c++ - 使用 MinGW 开发 Windows DDK?

c - 如果没有 pipe(),两个进程如何相互通信?

gcc - 如何解决编译期间的共享库链接(GCC)?

c - 我真的需要 libgcc 吗?