删除了 C 运行时库,我收到了一些未解析的外部问题

Removed the C runtime library, and i am receiving some unresolved externals

提问人:user2511688 提问时间:6/22/2013 更新时间:7/12/2017 访问量:2140

问:

嘿,伙计们,我正在开发一个应用程序,我删除了 CRT 以节省可执行文件中的大量空间并使其尽可能小:)问题是,当我删除 CRT 时,我还收到了大量未解决的外部错误,我只需添加一些运算符即可删除其中的大部分错误:

void * __cdecl operator new(unsigned int bytes) {
  return HeapAlloc(GetProcessHeap(), 0, bytes);
}

void __cdecl operator delete(void *ptr) {
  if(ptr) HeapFree(GetProcessHeap(), 0, ptr);
}

extern "C" int __cdecl __purecall(void) {
  return 0;
}

extern "C" const DWORD_PTR __security_cookie = 0xE64EBB40;

extern "C" void __fastcall __security_check_cookie(DWORD_PTR cookie) {
    if (cookie != __security_cookie)
        __asm int 3;
}

但是现在我被最后三个错误困住了,我不知道如何解决它们,我真正好奇的一个是_memmove错误?我没有在代码中的任何地方使用 memmove 运算符,所以我不知道为什么我会收到它:P

至少这里有错误,我会非常期待你的回答。

Error   2   error LNK2001: unresolved external symbol "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ)   C:\Users\Fluttershy!\documents\visual studio 2012\Projects\PincelStub\PincelStub\PincelStub.obj
Error   3   error LNK2001: unresolved external symbol "void __cdecl std::_Xlength_error(char const *)" (?_Xlength_error@std@@YAXPBD@Z)  C:\Users\Fluttershy!\documents\visual studio 2012\Projects\PincelStub\PincelStub\PincelStub.obj
Error   4   error LNK2001: unresolved external symbol _memmove  C:\Users\Fluttershy!\documents\visual studio 2012\Projects\PincelStub\PincelStub\PincelStub.obj
C++ Visual-Studio-2012 编译器错误 未解决的外部

评论

2赞 Hans Passant 6/22/2013
代码生成器假定您将链接 CRT,因此当它可以使用原语来优化代码时,它将生成对 memmove() 等基元的调用。让您也承担实现该任务的任务。并且您使用的是标准的 C++ 库方法,因此您需要执行实现它使用的帮助程序函数的任务。这是一项从未真正完成的工作。特别是当你发现你也不能真正跳过错误处理时,::operator new 应该抛出 std::bad_alloc。这才是真正痛苦的时候:)

答:

1赞 Massa 6/22/2013 #1

VC++ 可能在内部使用它们(例如,前两个用于发出错误条件的信号,以及在普通的旧分配中移动内存块)。前两个,我只定义为 ,但至于最后一个,我会尝试摆弄优化选项(关于“内在函数”等)或完全重新实现它(而不仅仅是存根)。_memmovestruct{}

0赞 Balog Pal 6/22/2013 #2

我不确定你为什么要朝自己的腿开枪,但无论如何。CRT 的源代码就在那里,因此您可以搜索它以查找丢失的内容并复制。 memmove 函数应该是显而易见的。另外两个看起来与标准异常有关。