运行时库错误匹配和VC++ - 哦,痛苦!

Jiv*_*son 12 runtime libc msvcrt visual-c++

似乎我所有的成年生活都受到VC++链接器的折磨或抱怨,因为各种库都不同意使用哪个版本的Runtime库.我从来没有心情去掌握那个令人沮丧的话题.所以我只是试着搞砸它直到它起作用.错误消息永远不会有用.关于这个问题的微软文档也没有 - 至少对我来说不是.

有时它找不到函数 - 因为名称错误不是预期的?有时它拒绝混合搭配.其他时候它只是说,"LINK:警告LNK4098:defaultlib'LIBCMTD'与使用其他库冲突;使用/ NODEFAULTLIB:库" 使用/ NODEFAULTLIB不起作用,但警告似乎是良性的.到底是什么"DEFAULTLIB"?链接器如何决定?我从来没有见过一种方法来指定链接器使用哪个运行时库,只是告诉编译器哪个库创建函数调用.

有"依赖性walker"程序可以检查目标文件以查看它们依赖的DLL.我刚刚在一个正在尝试构建的项目上运行了一个,这真是一团糟.有系统.libs和.dll需要冲突的运行时版本.例如,COMCTL32.DLL需要MSVCRT.DLL,但我正在与MSVCRTD.DLL链接.我正在寻找是否有COMCTL32D.DLL,即使我输入.

所以我想我要求的是如何对这些东西进行排序的教程.你做什么,你怎么做?

这就是我想我所知道的.如果有任何错误,请纠正我.

  1. 参数是Debug/Release,Multi-threaded/Single-threaded和static/DLL.仅涵盖八种可能组合中的六种.没有单线程DLL,无论是Debug还是Release.

  2. 这些设置仅影响链接到哪个运行时库(以及与之链接的调用约定).例如,如果要构建DLL,则不必使用基于DLL的运行时,在构建程序的Debug版本时也不必使用Debug版本的运行时,尽管它似乎有助于单个踩过系统调用.

奖金问题:任何人或任何公司怎么会造成这样的混乱?

Aar*_*otz 3

我认为你的观点(1)和(2)是正确的。(2) 中需要注意的另一件事是,调试 CRT 中的链接还使您可以访问增强的堆检查、检查的迭代器和其他各种健全性检查等内容。但是,您不能将调试 CRT 与您的应用程序一起重新分发 - 您必须仅使用发布版本进行发布。它不仅是 VC 许可证所要求的,而且您可能也不想传送调试二进制文件。

不存在这样的事情COMCTL32D.DLL。属于 Windows 一部分的 DLL 必须加载构建 Windows 时它们所链接的 CRT - 这作为 .dll 包含在操作系统中MSVCRT.DLL。此 Windows CRT 完全独立于由组成程序的模块加载的 Visual C++ CRT(MSVCRT.DLLWindows 附带的 CRT。例如,VC CRT 将包含版本号MSVCRT80.DLL)。只有组成程序的 EXE 和 DLL 文件才会受到调试/发布多线程/单线程设置的影响。

IMO 的最佳实践是为您的 CRT 选择一个设置,并针对您发送的每个二进制文件对其进行标准化。我个人会使用多线程 DLL 运行时。这是因为 Microsoft 可以(并且确实)向 CRT 发布可通过 Windows Update 推出的安全更新和错误修复。

  • 我发现了如何在 VC++ IDE 中“使用 /NODEFAULTLIB:libray”。打开“属性”,然后打开“链接器/输入”页面。将有问题的 DEFAULTLIB 的名称放入文本框“忽略特定库”。 (2认同)