В Windows C ++ DLL все глобальные объекты (включая статические члены классов) будут созданы непосредственно перед вызовом DllMain с DLL_PROCESS_ATTACH, и они будут уничтожены сразу после вызова DllMain с DLL_PROCESS_DETACH.
Теперь вы должны рассмотреть три проблемы:
0 - Конечно, глобальные неконстантные объекты являются злом (но вы уже знаете это, поэтому я не буду упоминать многопоточность, блокировки, объекты-боги и т. Д.)
1 - порядок построения объектов или различных модулей компиляции (т.е. файлов CPP) не гарантируется, поэтому вы не можете надеяться, что объект A будет построен до B, если два объекта будут созданы в двух разных CPP. Это важно, если B зависит от A. Решение состоит в том, чтобы переместить все глобальные объекты в один и тот же файл CPP, так как внутри одной и той же единицы компиляции порядок создания объектов будет порядок построения (и обратный порядок разрушения)
2 - Есть вещи, которые запрещено делать в DllMain. Эти вещи, вероятно, также запрещены в конструкторах. Так что избегайте блокировки чего-либо. Смотрите отличный блог Рэймонда Чена на эту тему:
http://blogs.msdn.com/oldnewthing/archive/2004/01/27/63401.aspx
http://blogs.msdn.com/oldnewthing/archive/2004/01/28/63880.aspx
В этом случае ленивая инициализация может быть интересной: классы остаются в «неинициализированном» состоянии (внутренние указатели равны NULL, логические значения имеют значение false), пока вы не вызовете один из их методов, после чего они будут инициализировать себя. Если вы используете эти объекты внутри main (или одной из функций-потомков main), все будет в порядке, потому что они будут вызываться после выполнения DllMain.
3 - Конечно, если некоторые глобальные объекты в DLL A зависят от глобальных объектов в DLL B, вы должны быть очень осторожны с порядком загрузки DLL и, следовательно, с зависимостями. В этом случае библиотеки DLL с прямой или косвенной циклической зависимостью приведут вас к безумной головной боли. Лучшее решение - разорвать круговые зависимости.
P.S .: Обратите внимание, что в C ++ конструктор может выдавать, и вам не нужно исключение в середине загрузки DLL, поэтому убедитесь, что ваши глобальные объекты не будут использовать исключения без очень веской причины. Поскольку правильно написанные деструкторы не имеют права на выброс, в этом случае выгрузка DLL должна быть в порядке.