Mój problem dotyczy duplikacji singletonów na Windowsie mimo użycia szablonów extern
.
Oto jak to wygląda:
- Projekt składa się z biblioteki oraz z GUI.
- Biblioteka tworzy singleton, który opakowuje fabrykę. Zarówno singleton jak i fabryka bazowane są na tych z książki Andrei Alexandrescu (czyli podobne do tych z biblioteki loki).
- Żeby nie duplikować singletonów, w nagłówkach biblioteki są szablony
extern
:
extern template class Utils::SimpleSingleton<Utils::SimpleFactory<T1, T2, T3>;
- Żeby ułatwić sobie życie mam też
typedef
:
typedef Utils::SimpleSingleton<Utils::SimpleFactory<T1, T2, T3> > CokolwiekFactory;
- W deklaracjach klas singletonu i fabryki mam te śmieszne Windowsowe
dllimport/export
. Załatwiam to makrem, które wygenerował mi projekt shared library w Qt. - W pliku źródłowym jest instantacja szablonu:
template LIB_EXPORT class Utils::SimpleSingleton<Utils::SimpleFactory<T1, T2, T3> >
W konfiguracji Debug wszystko działa jak należy - singletony są pojedyncze. W konfiguracji Release, która różni się tylko flagą -O2
, powstają dwa singletony - jeden wewnątrz biblioteki a drugi podczas pierwszego użycia CokolwiekFactory::getInstance()....
.
Moje pytanie brzmi: jak to możliwe? extern template
zabrania wykonania jakiejkolwiek niejawnej instantacji szablonu. Mimo tego to właśnie ma miejsce podczas działania GUI. Co dziwniejsze dzieje się tak tylko w Release.
Windows 7, kompilator: MinGW 4.6.2. Na Linuksie wszystko działa normalnie.