Re[6]: Не создаются глобальные объекты
От: vkoval  
Дата: 22.04.09 11:24
Оценка:
Здравствуйте, alsemm, Вы писали:

A>Здравствуйте, Erop, Вы писали:


E>>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>>Ты ставишь противоречивую задачу: если объект нигде не используется, то компилятор и не будет его создавать. Поэтому нужно либо явно использовать объект, либо как-то обмануть компилятор, тем же экспортом.


E>>Тем не менее, если просто cpp в проект включить, а не через статическую библиотеку, то коспилятор таки как-то решает "противоречивую задачу"

A>Вот тут объясняется почему так происходит: http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/2aa2e1b7-6677-4986-99cc-62f463c94ef3

A>FYI: gcc можно настроить чтобы он не умничал и включал в exe/dll все объектники из статических библиотек (--whole-archive).


A>Алексей


Спасибо!
Проблема решается в приведенной вами ссылки http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/2aa2e1b7-6677-4986-99cc-62f463c94ef3. Суть идеи в экспортирование пустой функции из той единицы трансляции, где определены глобальные объекты. Практически тоже самое что предложил Erop, только попроще.

В нужную единицу трансляции добавляем:

 namespace XXXEmptyReference
{ void emptyreference(){} }


А в заголовочный файл с описанием интерфейса класса (это интерфейс к объекту созданному тем самым «проблемным» глобальным объектом — creator), который подключается в MFC приложение, добавляем:

#pragma comment(linker, "/include:?emptyreference@XXXEmptyReference@@YAXXZ")


Из плюсов такой реализации стоит отметить:
1) Если приложение даже косвенно не использует глобальный объект из статической библиотеки, т. е. нет подключения заголовочного файла с интерфейсом, то объект не будет зря создан. Таким образом создание объекта контролируется включением его интерфейса в проект;
2) Теперь порядок создание глобальных объектов в статической библиотеке будет определен порядком включения их интерфейсных файлов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.