2017-01-04 1 views
0

Nach dem Entfernen der CRT aus meiner DLL habe ich diese seltsamen Fehler bekommen.Compiler-Problem nach dem Entfernen von CRT (DLL)

Hier sind sie:

  • LNK2001 nicht aufgelöstes externes Symbol "Leere __cdecl std :: _ Xbad_alloc (void)" (? _Xbad_alloc @ std @@ YAXXZ)
  • LNK2001 nicht aufgelöstes externes Symbol „Leere __cdecl std :: _ Xlength_error (char const *) "(? _Xlength_error @ std @@ YAXPBD @ Z)
  • LNK2001 nicht aufgelöst externes Symbol" void __cdecl std :: _ Xout_of_range (char const *) "(? _Xout_of_range @ std @@ YAXPBD @ Z)
  • nicht aufgelöstes externes Symbol __dtest
  • nicht aufgelöstes externes Symbol __fdtest
  • nicht aufgelöstes externes Symbol __invalid_parameter) noinfo_noreturn
  • nicht aufgelöstes externes Symbol
  • nicht aufgelöstes externes Symbol __stdio_common_vsprintf
  • nicht aufgelöstes externes Symbol __std_terminate

__stdio_common_vsnprintf_s Wenn ich das richtig das verstehen Xbad_alloc und Xlength_error sind becau Se der new und delete Operatoren? In diesem Fall erstelle ich meine Klasseninstanz wie folgt aus:

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; 
    } 

Wenn jemand weiß, wie diese auftreten, oder wie ich sie beheben kann es sehr geschätzt werden würde!

+1

Fügen Sie die Laufzeit zurück. Es gibt keinen guten Grund, es zu entfernen. –

+0

Nun Rob, der Grund, warum ich CRT entfernte, ist, weil ich mein eigenes Betriebssystem schreibe und PE-Dateien unterstützen möchte (derzeit unterstütze ich nur elf), es ist ein kleiner Kernel und ich werde später an meinem eigenen CRT arbeiten, für jetzt alles was ich brauche ist eine kleine PE-Binärdatei wie wenn sie mit Nasm oder ähnlichem kompiliert wurde. –

Antwort

0

Diese Fehler sind nicht komisch.

Compiler dürfen davon ausgehen, dass sie Code generieren können, der auf ihren Laufzeitbibliotheken beruht. Wenn Sie die Laufzeitbibliothek im Linkschritt auslassen, müssen Sie Definitionen für die fehlenden Symbole in Ihrem eigenen Code bereitstellen.

Das Deaktivieren bestimmter Compilerfunktionen kann die Anzahl der fehlenden Symbole verringern. Sie könnten beispielsweise versuchen, die Ausnahmebehandlung zu deaktivieren, um zu sehen, ob die internen Ausnahmeklassen noch erwartet werden. In Debug-Builds erwartet der Compiler möglicherweise noch mehr Unterstützung von der Laufzeit, die in Release-Builds erstellt wird.

Verwandte Themen