Статическая библиотека (назовем ее DummyStatic.a), которая объявляет и определяет следующий класс:
Код: Выделить всё
class DummySingleton {
private:
static DummySingleton the_instance_;
public:
DummySingleton& instance() noexcept; // defined in source file
};
Пока все хорошо, но допустим, у меня есть следующая настройка :
shared_lib_a.so иshared_lib_b.so связываются статически DummyStatic.a
static_lib_x.a связываетshared_lib_a.so иshared_lib_b.so< /p>
DummyExecutable — это исполняемый файл, который связывает static_lib_x.a (не вызывает никаких вызовов каких-либо функций, он просто содержит пустой int main() {..} )
Если я запущу эту настройку, как описано выше, ASAN выдаст мне предупреждения о нарушении ODR для переменной_instance_, и даже хуже, если я объявлю
статическую строку std::string внутри DummySingleton и определю ее в исходном коде. файл, я получу сбой с двойной ошибкой.
Теперь, если я избавлюсь от статического DummySingleton the_instance_ и сделаю его встроенным (встроенным в C++ 17) внутри исходного файла
или я определяю свою статику внутри исходного файла следующим образом:
DummySingleton.cpp:
Код: Выделить всё
static DummySingleton ds{};
DummySingleton& get_ds() {
return ds;
}
Я не могу понять, что здесь происходит, может мне кто-нибудь объяснить это?< /p>
Потому что каждая общая библиотека, которая включает заголовок с моим определением класса, попытается определить статический член, но второй подход (статический файл) не вызывает этой проблемы, поскольку переменная внутренний по отношению к единице перевода, где он определен? и он не отображается в заголовках и не реплицируется в общих библиотеках?
Подробнее здесь: https://stackoverflow.com/questions/787 ... s-in-linux