Проблема компилятора после удаления CRT (DLL)

После удаления CRT из моей DLL я получил эти странные ошибки.

Вот они:

  • LNK2001 неразрешенный внешний символ "void __cdecl std:: _ Xbad_alloc (void)" (? _Xbad_alloc @ std @@ YAXXZ)
  • LNK2001 неразрешенный внешний символ "void __cdecl std:: _ Xlength_error (char const *)" (? _Xlength_error @ std @@ YAXPBD @ Z)
  • LNK2001 неразрешенный внешний символ "void __cdecl std::_Xout_of_range(char const *)" (?_Xout_of_range@std@@YAXPBD@Z)
  • неразрешенный внешний символ __dtest
  • неразрешенный внешний символ __fdtest
  • неразрешенный внешний символ __invalid_parameter)noinfo_noreturn
  • неразрешенный внешний символ __stdio_common_vsnprintf_s
  • неразрешенный внешний символ __stdio_common_vsprintf
  • неразрешенный внешний символ __std_terminate

Если я правильно понимаю, Xbad_alloc а также Xlength_error из-за new а также delete операторы? В этом случае я создаю свой экземпляр класса следующим образом:

class sc_Core
    {
    public:
        static sc_Core *Instance(void);
        func A();
    public:
        void *operator new(size_t si)
        {
            return HeapAlloc(GetProcessHeap(), NULL, si);
        }
        void operator delete(void *pv) throw()
        {
            HeapFree(GetProcessHeap(), NULL, pv);
        }
    private:
        sc_Core(void) { }
        ~sc_Core(void) { }
        sc_Core(const sc_Core&) { }
        sc_Core(sc_Core&&) {}
        sc_Core& operator=(const sc_Core&) {}
        sc_Core& operator=(sc_Core&&) {}
        static sc_Core *p_Instance;
    };

// Global Scope
sc_Core *sc_Core::p_Instance = nullptr;


    sc_Core *sc_Core::Instance(void)
    {
        if (p_Instance == nullptr)
            p_Instance = new sc_Core();

        return p_Instance;
    }

Если кто-нибудь знает, как это происходит или как я могу их исправить, это будет очень цениться!

1 ответ

В этих ошибках нет ничего странного.

Компиляторы могут предполагать, что они могут генерировать код, основанный на их библиотеках времени выполнения. Если вы собираетесь опустить библиотеку времени выполнения на шаге ссылки, вам придется предоставить определения для отсутствующих символов в вашем собственном коде.

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

Другие вопросы по тегам