Как принудительно включить определение «неиспользуемых» объектов в библиотеке

Мой вопрос подобен этим, но, похоже, точно не коррелирует:

Как принудительно включить объектный файл в статическую библиотеку при связывании с исполняемым файлом?

Формирование экспорта символов с помощью MSVC

У меня есть что-то вроде этого:

struct thingy; struct container { static container& instance(); // singleton int register_thingy(thingy*); }; struct thingy { virtual ~thingy() {} virtual int id() const = 0; }; //template trick to force registration. template  struct registered_thingy : thingy { registered_thingy() : my_id(my_static_id) {} int id() const { return my_id; } private: int my_id; static int my_static_id; } template  int registered_thingy::my_static_id = container::instance().register_thingy(new Derived); 

Теперь в файле specific_thingy.cpp у меня есть:

 struct my_concrete_thingy : registered_thingy { my_concrete_thingy() {} // registered_thingy's constructor not called otherwise }; 

Конечно, вышесказанное совершенно бесполезно, но здесь есть реальное поведение.

Это прекрасно работает при использовании в приложении, которое скомпилировано в целом. Проблема в том, что пока я не могу использовать эту технику во время разлива поведения collection в библиотеке. Другими словами, у меня есть файл thingys.lib который содержит thingys.lib , но регистрация не происходит, когда это связано с исполняемым файлом. collection заканчивается и работает отлично, но она пуста.

Теперь это библиотека STATIC, а не DLL. Это может немного изменить проблему, и методы, о которых говорится в ссылках выше, похоже, не применяются. Конечно, речь идет о функциях, и я не вижу, как я могу применить их к этим структурам C ++.

Я попытался использовать метод #pragma comment со следующими тремя строками (индивидуально, конечно) в concrete_thingy.cpp , ни один из которых не работал:

 #pragma comment (linker, "/export:concrete_thingy") #pragma comment (linker, "/export:concrete_thingy::my_static_id") #pragma comment (linker, "/export:registered_thingy::my_static_id") 

Если concrete_thingy.cpp находится в исполняемом файле, а не в библиотеке, все работает нормально.

Итак, вот мои вопросы:

1) Можно ли делать то, что я пытаюсь сделать? Я предполагаю, что да, но я просто не знаю, как это сделать.

2) Если это возможно, как мне получить MSVC ++ 2010?

3) Если это возможно, как я могу сделать это переносным способом?

Короче говоря, то, что я пытаюсь сделать, будет похоже на создание абстрактной фабрики, которая создает реализации абстракции. Он ничего не знает об этих реализациях, которые регистрируются с использованием глобальной инициализации. Все это должно быть в статической библиотеке, к которой может быть привязано приложение, и эти реализации должны быть доступны через эту фабрику. Никто не знает об этих реализациях, кроме самих себя, и, таким образом, нормальная связь заставляет их и их глобальные регистры исчезнуть.

Это не совсем то, что я делаю, но это достаточно близко.

Изменить: ================================================================================================= ====

Похоже, это поведение «по дизайну». MS признает, что строительство объекта, вызывающего побочные эффекты, должно происходить независимо от того, использовались они или нет, они используют лазейку в стандарте, которая позволяет им не включать единицы перевода, в которых ничего не используется: \

https://connect.microsoft.com/feedback/viewfeedback.aspx?FeedbackID=244410&wa=wsignin1.0&siteid=210

Опция / OPT: NOREF предназначена для того, чтобы в этом случае ничего не делать.

Ну, другой отвечает, где хорошие попытки, но в конечном счете бесплодные. Я собираюсь использовать фиктивный трюк, но остальные, похоже, были красной селедкой; это имеет смысл, поскольку данный шаблон фактически не используется нигде, так что тот факт, что он явно не создан, не должен иметь никакого значения … декларация глобального все еще происходит в блоке перевода A, у него есть побочные эффекты … Я не думаю, что стандарт позволяет оптимизировать его.

Несчастный бит о стандарте, не говоря о том, требуется ли вообще включать переводную единицу, является окончательной проблемой. Я думаю, что C ++ 0x что-то делает с этим, но, может быть, и не … Во всяком случае, MS не стесняется вообще не включать блок, и поскольку он не включен в исполняемый файл, ни одна другая дерьмо не бывает.

То, что я решил сделать, и, конечно, есть много других способов, – создать переменную «тег» файла. Затем этому тегу присваивается функция, доступная по всему миру (она должна быть назначена или назначена, или ссылка оптимизирована). Затем эту функцию нужно вызывать из исполняемого файла.

Я решил сделать это так, потому что тогда все остальное работает так же, как и всегда. Я не могу в конечном итоге изменить поведение, как я мог, если бы просто написал регистрационную функцию, зарегистрированную вручную. Плюс я могу делать другие вещи таким образом … Я просто должен убедиться, что все, что может попасть в эту classификацию fucktardery, имеет тег и доступ к этому тегу.

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

Существует опция компоновщика / OPT: REF и / OPT: NOREF, доступ к которой осуществляется через ссылки -> optimization -> ссылки.

  • Как использовать OpenSSL в GCC?
  • Почему при использовании шаблонов я получаю ошибки «неразрешенных внешних символов»?
  • Ошибки компоновщика при компиляции против glib ...?
  • Как удалить пакет из Laravel с помощью композитора?
  • Что означает «статически связанное» и «динамически связанное»?
  • Почему компиляторы настолько глупы?
  • Шаблон C ++, ссылка на ошибку
  • Что такое Microsoft Visual Studio, эквивалентная опции GCC ld - whall-archive
  • Interesting Posts

    Можно ли управлять размером массива с помощью параметра типа общего?

    Включить доступ к программам в гостевой учетной записи в Windows 7

    Почему нет ConcurrentHashSet против ConcurrentHashMap

    Android Studio: добавить jar в качестве библиотеки?

    Использование атрибута onClick в макете xml вызывает NoSuchMethodException в диалоговом окне Android

    c # словарь один ключ многие значения

    Как я могу убить stream? без использования stop ();

    Как обнаружить кнопку отправки нажатой в нескольких сценариях кнопок отправки в одном classе Action?

    Должны ли частные / защищенные методы проходить единичный тест?

    Как получить места (например, газовые станции) вдоль маршрута между проездом и пунктом назначения в API Карт Google

    Как синхронизировать контакты Outlook с Gmail?

    Пакетный выпуск – создание папок и перемещение документов

    Windows 7 на предприятии. Как насчет изображения с учетной записью?

    Как сделать vlookup и заполнить (например, в Excel) в R?

    Создание видео с изображений с различными SAR с помощью FFMPEG

    Давайте будем гением компьютера.