2

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

4

1 回答 1

1

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

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

于 2013-07-28T21:40:56.050 回答