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