Связывает ли две библиотеки DLL с одной и той же статической библиотекой, а затем связывает обе библиотеки DLL вместе, является нарушением ODR? - PullRequest
2 голосов
/ 08 ноября 2019

Я столкнулся с ситуацией в нашей кодовой базе, когда две библиотеки DLL, которые связаны друг с другом, обе статически связаны с одной и той же статической библиотекой. Это приводит к тому, что обе библиотеки DLL извлекают отдельную копию статической библиотеки, когда они связаны.

enter image description here

В этой конкретной ситуации статическая библиотека содержиткласс, который должен быть одноэлементным ... Но поскольку обе библиотеки DLL извлекают свою собственную копию, когда DLL1 пытается получить доступ к одноэлементному файлу, она получает экземпляр, отличный от DLL2! Это вызывает много проблем с состоянием и инициализацией программы, потому что обе библиотеки видят различное состояние программы.

Я понимаю, что происходит плохо, и это ошибка в программе. Но действительно ли это в области «неопределенного поведения»? Нарушает ли это правило One Definition ?

Как насчет ситуации, когда статическая библиотека не содержит синглтона. Тогда это совершенно нормально, или это все еще проблема? (Если это нарушает ODR, я предполагаю, что это все еще проблема.)

...