Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将两个DLL链接到同一个静态库,然后将两个DLL链接在一起是否违反ODR?_C++_Dll_Linker_One Definition Rule - Fatal编程技术网

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

C++ 将两个DLL链接到同一个静态库,然后将两个DLL链接在一起是否违反ODR?,c++,dll,linker,one-definition-rule,C++,Dll,Linker,One Definition Rule,我在我们的代码库中遇到了一种情况,两个DLL相互链接,都静态链接到同一个静态库。这导致两个DLL在链接时都会拉入静态库的单独副本 在这种特殊情况下,静态库包含一个打算作为单例的类。。。但是由于两个DLL都拉入自己的副本,所以当DLL1尝试访问单例时,它会得到一个与DLL2不同的实例!这会导致程序状态和初始化出现很多问题,因为两个库都会看到不同的程序状态 我知道发生的事情很糟糕,是程序中的一个bug。但它实际上是在“未定义的行为”领域吗?这是否违反了法律 静态库不包含单例的情况如何。那么这完全没

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

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

我知道发生的事情很糟糕,是程序中的一个bug。但它实际上是在“未定义的行为”领域吗?这是否违反了法律


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

将单例放在不同的位置dll@drescherjm这就是我正在做的,但是在静态库中除了单例之外还有其他的东西。这些东西留在静态库中可以吗?尽管我更喜欢将静态库制作成DLL,但我注意到boost 1.68.0 headers only表单可以构建到多个DLL中,并且可以按预期在全局范围内工作。因此,这意味着巧妙地将静态库变成只包含头的库,这也是摆脱这种DLL地狱味道的一种方法。@WilliamClements我真的很好奇这是如何处理只包含头的库的。。。我想你也会遇到同样的问题。我相信只要你链接到相同的静态库实现,你是安全的。我无法回答标准对这方面的规定。您的单例问题可能是因为每个
dll
都创建了自己的静态变量实例。