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

时间:2010-03-02 00:09:10

标签: visual-c++ runtime msvcrt libc

似乎我所有的成年生活都受到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版本的运行时,尽管它似乎有助于单个踩过系统电话。

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

1 个答案:

答案 0 :(得分:3)

您的观点(1)和(2)对我来说是正确的。另外需要注意的是(2),调试CRT中的链接还可以访问增强堆检查,检查迭代器和其他各种健全性检查。但是,您无法使用您的应用程序重新分发调试CRT - 您必须仅使用发布版本发布。 VC许可证不仅要求它,而且您可能不希望发送调试二进制文件。

没有COMCTL32D.DLL之类的东西。作为Windows的一部分的DLL必须加载它们在构建Windows时链接的CRT - 它作为MSVCRT.DLL包含在操作系统中。此Windows CRT完全独立于由组成程序的模块加载的Visual C ++ CRT(MSVCRT.DLL是Windows附带的模块.VC CRT将包含版本号,例如{{1} })。只有构成您的程序的EXE和DLL文件才会受到调试/发布多线程/单线程设置的影响。

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