代码之家  ›  专栏  ›  技术社区  ›  Jive Dadson hmishra2250

运行时库不匹配和vc++-哦,不幸的是!

  •  12
  • Jive Dadson hmishra2250  · 技术社区  · 15 年前

    似乎在我的成年生活中,我一直受到VC++链接器的折磨,抱怨或犹豫,因为不同的库不同意使用哪个版本的运行库。我从来没有心情去掌握那个令人沮丧的话题。所以我只是想把事情搞砸,直到它成功。错误消息永远不会有用。这方面的微软文档也不是——至少对我来说不是。

    有时它找不到函数-因为名称管理不是预期的?有时它拒绝混合和匹配。有时它只是说, “链接:警告lnk4098:defaultlib”“libcmtd”“与其他lib的使用冲突;使用/nodefaultlib:library” 使用/nodefaultlib不起作用,但警告似乎是良性的。“defaultlib”到底是什么?链接器如何决定?我从来没有见过向链接器指定要使用哪个运行库的方法,只知道如何告诉编译器要为哪个库创建函数调用。

    有一些“依赖性Walker”程序可以检查对象文件以查看它们所依赖的DLL。我刚在一个我正在尝试的项目上运行了一个,这真是一团糟。有System.libs和.dll需要冲突的运行时版本。例如,comctl32.dll需要msvcrt.dll,但我正在与msvcrtd.dll链接。我正在搜索是否有一个comctl32d.dll,即使我键入。

    所以我想我要的是一个如何整理这些东西的教程。你做什么,怎么做?

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

    1. 这些参数包括调试/发布、多线程/单线程和静态/dll。八种可能的组合中只有六种被涵盖。没有单线程dll,调试或释放。

    2. 这些设置只影响链接到哪个运行库(以及与之链接的调用约定)。例如,如果您正在构建一个dll,则不必使用基于dll的运行时,也不必在构建一个程序的调试版本时使用运行时的调试版本,尽管在单步执行系统调用时似乎有帮助。

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

    1 回复  |  直到 15 年前
        1
  •  3
  •   Aaron Klotz    15 年前

    你的观点(1)和(2)对我来说是正确的。(2)要注意的另一件事是,debug crt中的链接还允许您访问增强的堆检查、检查的迭代器和其他分类的健全性检查。但是,您不能将调试CRT与您的应用程序一起重新发布——您必须仅使用发布版本来发布。它不仅是VC许可证所要求的,而且您可能不希望发送调试二进制文件。

    没有这样的事情 COMCTL32D.DLL . 作为Windows的一部分的DLL必须加载在构建Windows时链接到的CRT——这是OS AS中包含的 MSVCRT.DLL . 此Windows CRT完全独立于由程序组成的模块加载的Visual C++ CRT( msvcrt.dll文件 是装有窗户的那个。例如,VC CRT将包括一个版本号。 MSVCRT80.DLL )只有组成 你的 程序受调试/释放多线程/单线程设置的影响。

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