有人能解释为什么加载共享库会破坏静态变量吗?
答案 0 :(得分:0)
这取决于平台和编译器。一种解决方案是将此静态变量初始化为代码中的预期值。
答案 1 :(得分:0)
可能在加载共享库时,它有另一个Core副本(带有空列表)。并且在加载共享库之后,您可以访问第二个副本,或者第二次初始化此静态列表(再次,在加载库后它将为空)。尝试在加载库之前和之后比较此列表地址,您将得到答案。 无论如何,似乎问题在于使用静态变量的两个实例。
答案 2 :(得分:0)
您应确保动态库链接到用于构建程序的同一Qt库。这不应该是一个问题,因为QT是二进制兼容的,但是,我在Windows上看到了很多这样的错误,我们用不同的ABI切换到更新的编译器(mingw 4.8)。也许这是你所看到的效果。
答案 3 :(得分:0)
这种行为是因为全局偏移表(GOT),其中ld.so用于init可执行映像。实际上,上面例子中的静态字段初始化了两次。第一次在可执行加载期间,第二次在库加载期间。 “static_initialization_and_destruction”proc来自ld.lib的“dl_init_internal”过程。