Получение Loki Singleton для работы в DLL в VS 2008 C ++ - PullRequest
1 голос
/ 17 июня 2009

Я почти уверен, что эта проблема не нова, и уверен, что ее трудно решить. Надеюсь, я ошибаюсь в последнем.

Я пытаюсь использовать Loki :: Singleton из Modern C ++ Design в моей программе.

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

Очевидно, это делает Синглтон очень не единственным.

Есть ли способ обойти это поведение?

Ответы [ 3 ]

2 голосов
/ 17 июня 2009

Я вижу в исходном каталоге Loki, что у них есть конкретный SingletonDLL каталог , который тестируется, похоже, что они используют экспортированный явно созданный экземпляр шаблона (который будет работать). Надеюсь, он содержит код, который вы хотите.

1 голос
/ 17 июня 2009

Обратите внимание, что это не решит вопрос. Явно созданный и экспортированный синглтон должен сделать свое дело ...

-Rick

Проверьте #pragma data_seg здесь В основном вам нужно объявить экземпляр синглтона в общей секции вашего кода. По умолчанию статика распространяется на dll.

С шаблонами может быть сложно, но это путь к успеху, который не подразумевает передачу / копирование статических данных.

0 голосов
/ 17 июня 2009

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

Возможные решения:

  • Не использует синглтоны. На самом деле это мое обычное предпочтение, потому что вы можете избежать целых классов проблем, изменив дизайн так, чтобы он не требовался. Чтобы узнать, почему синглтоны могут быть вредными, см. этот пост Yegge. Я не против этого, но в 95% случаев синглтоны вызывают гораздо больше проблем, чем решают (если они действительно решают какие-либо проблемы)
  • Копирование статических элементов через границы DLL. Я также сделал это как хак, где DLL получает указатель из приложения или другой DLL и сбрасывает свою собственную копию статического члена класса в указатель, переданный извне. Это зло, оно грязно, после него нельзя убирать, но оно работает.
...