首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行库错误匹配和VC++ -哦,痛苦!

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

Stack Overflow用户
提问于 2010-03-02 00:09:09
回答 1查看 4.6K关注 0票数 12

似乎在我的成年生活中,我一直被VC++链接器所折磨,抱怨或退缩,因为不同的库都不同意使用哪个版本的运行时库。我从来没想过要掌握这个令人沮丧的话题。所以我就试着把它弄乱,直到它起作用。错误消息从来没有用过。微软在这个问题上的文档也不是--至少对我来说不是。

有时它找不到函数--因为名称--mangling不是人们所期望的?有时它拒绝混合和匹配。其他时候,它只是说:“链接:警告LNK4098: defaultlib 'LIBCMTD‘与其他库的使用冲突;使用/NODEFAULTLIB:library”使用/NODEFAULTLIB不起作用,但警告似乎是良性的。"DEFAULTLIB“到底是什么?链接器是如何决定的?我从未见过一种向链接器指定要使用哪个运行时库的方法,只知道如何告诉编译器创建函数调用的库。

有一些“依赖程序”可以检查对象文件,以查看它们所依赖的DLL。我刚刚在一个我想要建立的项目上运行了一个,这真是一团糟。有一些系统.libs和..dll需要冲突的运行时版本。例如,COMCTL32.DLL需要MSVCRT.DLL,但我正在与MSVCRTD.DLL链接,我正在搜索是否存在COMCTL32D.DLL,即使我键入。

,所以我想我想要的是一个关于如何解决这些问题的教程。你做什么,你是怎么做的?

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

  1. 参数是调试/发布、多线程/单线程和静态/DLL。在这八种可能的组合中,只有六种被涵盖。没有单线程DLL,无论是调试还是发布。
  2. 设置只会影响在哪个运行时库中链接(以及与它链接的调用约定)。例如,如果您正在构建DLL,则不必使用基于DLL的运行时,也不必在构建程序的调试版本时使用运行时的调试版本,尽管在单步通过系统调用时它似乎有所帮助。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-02 01:44:10

你的观点(1)和(2)在我看来是正确的。使用(2)需要注意的另一件事是,调试CRT中的链接还允许您访问诸如增强堆检查、检查迭代器和其他各种正常检查。但是,您不能在应用程序中重新分发调试CRT --您必须只使用版本构建。这不仅是VC许可证所要求的,而且您可能也不想发布调试二进制文件。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2360084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档