Нарушение ODR со статическими переменными и несколькими общими библиотеками в LinuxLinux

Ответить Пред. темаСлед. тема
Anonymous
 Нарушение ODR со статическими переменными и несколькими общими библиотеками в Linux

Сообщение Anonymous »

Предположим, у меня есть следующий сценарий:
Статическая библиотека (назовем ее DummyStatic.a), которая объявляет и определяет следующий класс:

Код: Выделить всё

class DummySingleton {
private:
static DummySingleton the_instance_;
public:
DummySingleton& instance() noexcept; // defined in source file
};
Итак, этот класс объявляет the_instance_ в заголовочном файле внутри класса DummySingleton и определяет его в исходном файле.
Пока все хорошо, но допустим, у меня есть следующая настройка :
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;
}
Все выглядит нормально, ASAN не жалуется.
Я не могу понять, что здесь происходит, может мне кто-нибудь объяснить это?< /p>
Потому что каждая общая библиотека, которая включает заголовок с моим определением класса, попытается определить статический член, но второй подход (статический файл) не вызывает этой проблемы, поскольку переменная внутренний по отношению к единице перевода, где он определен? и он не отображается в заголовках и не реплицируется в общих библиотеках?

Подробнее здесь: https://stackoverflow.com/questions/787 ... s-in-linux
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»