从我的DLL中删除CRT后,我发现了这些奇怪的错误。
他们是:
- 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;
}
如果有人知道这些是如何发生的,或者我如何解决它们,我们将非常感激!
答案 0 :(得分:0)
这些错误并不奇怪。
允许编译器假设他们可以生成依赖于运行时库的代码。如果您要在链接步骤中省略运行时库,那么您必须在自己的代码中提供缺失符号的定义。
关闭某些编译器功能可能会减少丢失符号的数量。例如,您可以尝试关闭异常处理支持,以查看是否仍然需要内部异常类。在调试版本中,编译器可能期望在发布版本中获得运行时的更多支持。