将两个 DLL 链接到同一个静态库,然后将这两个 DLL 链接在一起是否违反了 ODR?

tjw*_*992 5 c++ dll linker one-definition-rule

我在我们的代码库中遇到过一种情况,两个相互链接的 DLL 都静态链接到同一个静态库。这会导致两个 DLL 在链接时拉入静态库的单独副本。

在此输入图像描述

在这种特殊情况下,静态库包含一个旨在成为单例的类...但是由于两个 DLL 都提取了自己的副本,因此当 DLL1 尝试访问单例时,它会获得与 DLL2 不同的实例!这会导致程序状态和初始化出现很多问题,因为两个库看到的程序状态不同。

我知道发生的事情很糟糕,并且是程序中的错误。但这真的属于“未定义行为”的范畴吗?这是否违反单一定义规则

那静态库不包含单例的情况呢?那么就完全没问题了,还是仍然存在问题?(如果它违反了 ODR,我认为它仍然是一个问题。)