C++ 延迟第三方库中静态变量的初始化

C++ 延迟第三方库中静态变量的初始化,c++,static,static-libraries,global,C++,Static,Static Libraries,Global,我正在链接一个使用静态变量的第三方库。它们最终在main之前被初始化,过早地获取资源,在我的应用程序中造成了一些混乱。是否有任何习惯用法/技术/包装方法可以重新获得控制并定义执行点,允许库初始化其所有静态变量,而无需对库本身进行黑客攻击 具体来说,我有一个thirdpartylib::system对象,它一旦在main中定义,就会在进入main之前获取各种资源。编译器看到可以命中代码,然后在库使用者无法控制的情况下初始化所有静态变量。理想情况下,我想找个保安来阻止这一切,直到我这么说,比如 //

我正在链接一个使用静态变量的第三方库。它们最终在main之前被初始化,过早地获取资源,在我的应用程序中造成了一些混乱。是否有任何习惯用法/技术/包装方法可以重新获得控制并定义执行点,允许库初始化其所有静态变量,而无需对库本身进行黑客攻击

具体来说,我有一个thirdpartylib::system对象,它一旦在main中定义,就会在进入main之前获取各种资源。编译器看到可以命中代码,然后在库使用者无法控制的情况下初始化所有静态变量。理想情况下,我想找个保安来阻止这一切,直到我这么说,比如

// my code that may exit before I want the lib stuff to be invoked
{
    LET_SYSTEM_RUN_RIOT();
    thirdpartylib::system sys;
    // do some stuff with it
    KILL_IT_ALL_WITH_FIRE();
}

您唯一能做的就是动态构建它,并在运行时通过dload/LoadLibrary加载它。然后,您就可以完全控制库自身初始化的时间。通过静态链接,从概念上讲,您将使库成为应用程序的一部分,这意味着它将作为应用程序的一部分进行初始化,即在主函数之前进行初始化。

您唯一能做的就是动态构建库,并在运行时通过dload/LoadLibrary进行加载。然后,您就可以完全控制库自身初始化的时间。通过静态链接,从概念上讲,您将使库成为应用程序的一部分,这意味着它将作为应用程序的一部分进行初始化,即在主函数之前进行初始化。

库可以动态链接,还是只有静态链接选项?我可能误解了,但我得到的印象是,您正在定义问题类型的全局变量。您是否尝试在函数中仅使用局部变量?特别是在main内部,或者如果有必要,在{}块中,只在side main中稍后到达,以便在之前执行一些代码。@Yunnosch不,我并没有定义问题类型的全局变量。问题类型取决于全局变量,因此只要允许编译器看到您在应用程序执行过程中的某个时刻可能需要使用全局变量,就意味着它将在main之前初始化它所依赖的所有全局变量,从最上面的注释和当前的答案来看,看起来我将对库源代码进行静态链接。Hmph@learnvst如果不能将该库构建为共享的LIB,则可以考虑用自己的共享库包装API,并执行RuuNVB建议的答案。该库可以动态链接,或者它们只有静态链接选项吗?我可能误解了,但我得到的印象是,您正在定义问题类型的全局变量。您是否尝试在函数中仅使用局部变量?特别是在main内部,或者如果有必要,在{}块中,只在side main中稍后到达,以便在之前执行一些代码。@Yunnosch不,我并没有定义问题类型的全局变量。问题类型取决于全局变量,因此只要允许编译器看到您在应用程序执行过程中的某个时刻可能需要使用全局变量,就意味着它将在main之前初始化它所依赖的所有全局变量,从最上面的注释和当前的答案来看,看起来我将对库源代码进行静态链接。Hmph@learnvst如果不能将该库构建为共享库,则可以考虑用自己的共享库包装API,并执行RuuNVB建议的答案。