[MinGW] классы и флаг -nostdlib

Тема в разделе "LANGS.C", создана пользователем Rel, 16 фев 2011.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    извиняйте, гугл чет не помог в этот раз... пытаюсь собрать простой синглтон с флагом -nostdlib:
    single.h:
    Код (Text):
    1. #ifndef _SINGLE_H_INCLUDED_
    2. #define _SINGLE_H_INCLUDED_
    3.  
    4. #include <windows.h>
    5.  
    6. class Single
    7. {
    8.     public:
    9.         static Single* GetInstance();
    10.         static void  Release();
    11.  
    12.     private:
    13.         Single();
    14.         ~Single();
    15. };
    16.  
    17. #endif
    single.cpp
    Код (Text):
    1. #include <single.h>
    2.  
    3. Single::Single() { MessageBoxA(NULL, "CONSTRUCTOR", "WORKS!", MB_OK); }
    4.  
    5. Single::~Single() { MessageBoxA(NULL, "DESTRUCTOR", "WORKS!", MB_OK); }
    6.  
    7. Single* Single::GetInstance()
    8. {
    9.     // Вызов конструктора по умолчанию
    10.     static Single Instance;
    11.     return &Instance;
    12. }
    13.  
    14. void Single::Release()
    15. {
    16.     // Вызов деструктора по умолчанию
    17.     Single::GetInstance()->~Single();
    18. }
    main.cpp
    Код (Text):
    1. #include <single.h>
    2.  
    3. int _main()
    4. {
    5.     Single* single = Single::GetInstance();
    6.     single->Release();
    7.     return 0;
    8. }
    получаю кучу ошибок линкера на функции, которые MinGW добавляет в мой бинарь... среди них atexit, __gxx_personality_sj0, _Unwind_SjLj_Register и другие... вопрос: возможно ли реализовать подобный синглтон без зависимости на стандартные либы, и если да то как это сделать...
     
  2. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    я думаю, что как и в ms c++ некоторые ооп фичи завязаны на rtl. в частности, вызов деструктора объекта в статической памяти осуществляется с помощью функции atexit
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да в студии спокойно реализовывается.

    Только спецефические типа исключений.

    По-разному бывает, но в целом, и это тоже. Но оно так только в случае хитрых инициализаторов, например,
    Код (Text):
    1. #include <windows.h>
    2. int initialize() { return 5+GetLastError(); }
    3. int some_var = initialize();
    4. int main()
    5. {
    6.   return some_var;
    7. }
    Всего о нескольких вещах нужно позаботиться при отказе от crt (речь не про сишную crt, а про crp - c++ runtime): об исключениях, о инициализаторах/терминаторах (то, о чем ты говоришь), некоторые штуки из namespace std (в первую очередь, для stringbuf), ... да вроде всё.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    да, atexit по идее должен вызвать деструктор синглтона по завершении работы приложения, но я хочу делать это самостоятельно, вызывая функцию Release... остальные пока не особо понятно зачем там...

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

    ADD: в студии для статически выделенного синглтона не хватает _atexit и оператора delete))
    есть ли возможность отучить компилятор пытаться удалять мой синглтон?))
     
  5. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    может так лучше instance сделать статическим членом класса, а его созданием/удалением управлять вручную?
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    можно, но тогда понадобится _initterm для инициализации указателя на instance внутри класса в NULL... уходим от одного - приходим к другому... но дело даже не в этом, я могу и заглушки сделать на эти функции, поскольку они скорее всего бессмысленны... вот допустим с atexit ситуация, компилятор пытыается этой функцией зарегистрировать деструктор в массиве atexit-функций, но... дело в том, что CRT-точка входа не используется, и получается что этот массив никто не станет вызывать... так зачем atexit?
     
  7. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    вероятно, регистрация через atexit вставляется непосредственно компилятором, которому вообще нет дела до точки входа.