似乎在我的成年生活中,我一直被VC++链接器所折磨,抱怨或退缩,因为不同的库都不同意使用哪个版本的运行时库。我从来没想过要掌握这个令人沮丧的话题。所以我就试着把它弄乱,直到它起作用。错误消息从来没有用过。微软在这个问题上的文档也不是--至少对我来说不是。
有时它找不到函数--因为名称--mangling不是人们所期望的?有时它拒绝混合和匹配。其他时候,它只是说:“链接:警告LNK4098: defaultlib 'LIBCMTD‘与其他库的使用冲突;使用/NODEFAULTLIB:library”使用/NODEFAULTLIB不起作用,但警告似乎是良性的。"DEFAULTLIB“到底是什么?链接器是如何决定的?我从未见过一种向链接器指定要使用哪个运行时库的方法,只知道如何告诉编译器创建函数调用的库。
有一些“依赖程序”可以检查对象文件,以查看它们所依赖的DLL。我刚刚在一个我想要建立的项目上运行了一个,这真是一团糟。有一些系统.libs和..dll需要冲突的运行时版本。例如,COMCTL32.DLL需要MSVCRT.DLL,但我正在与MSVCRTD.DLL链接,我正在搜索是否存在COMCTL32D.DLL,即使我键入。
,所以我想我想要的是一个关于如何解决这些问题的教程。你做什么,你是怎么做的?
我想我知道的是。如果有任何错误,请纠正我。
。
额外的问题:怎么会有人或任何公司造成这样的混乱?
发布于 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推送出去。
https://stackoverflow.com/questions/2360084
复制相似问题