我一直在开发的一个 Windows 应用程序是在不使用 CRT 的情况下交付的。
有一些很好的文章描述了这样做的指导方针和好处(我在写这个问题时找不到这些 - 抱歉)。除了不明确使用 CRT 符号之外,这一切都与链接器和编译器配置有关。我的发布和调试配置现在几乎相同,并且都指定 /NODEFAULTLIB:"LIBCMT"
唯一的区别是运行时标志 /MT
(在发布中)与 /MTd
(在调试中) - 这是必需的,因为我对 SEH
使用 __try/__ except
语法,因此唯一需要的函数是 _except_handler3()
。但是,调试版本正在成功构建,而发布版本则失败,并出现 Unresolved Symbol _ except_handler3
链接错误。当强制发布版本使用 /MTd
进行编译时 - 此问题已解决。
这怎么可能?哪个 .lib
包含 _ except_handler3 导出?我该如何解决这个问题?
最佳答案
对于没有 CRT 的应用程序,请参阅:http://blog.kalmbach-software.de/2008/02/02/smallest-application-size-for-win32-console-application/
但是如果你想使用__try/__ except则需要使用CRT;或者您需要编写自己的“_ except_handler3”。
另请参阅:_except_handler3
您还有 CRT 源代码,您可以查看源代码,看看它在做什么! 请参阅:C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src
关于c - 调试和发布之间的奇怪链接差异导致未解析的 _except_handler3,或者为什么,哦,为什么我不知道 libcmtd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21916530/