Здравствуйте, 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) Теперь порядок создание глобальных объектов в статической библиотеке будет определен порядком включения их интерфейсных файлов.