似乎我整个成年生活都被 VC++ 链接器抱怨或犹豫所折磨,因为各种库不同意使用哪个版本的运行时库。我从来没有心情去掌握那个令人沮丧的主题。所以我只是试着弄乱它,直到它起作用。错误消息永远不会有用。微软关于这个主题的文档也不是——至少对我来说不是。
有时它找不到函数 - 因为名称修改不是预期的?有时它拒绝混搭。有时它只是说,“链接:警告 LNK4098:defaultlib 'LIBCMTD' 与使用其他库发生冲突;使用 /NODEFAULTLIB:library” 使用 /NODEFAULTLIB 不起作用,但警告似乎是良性的。到底什么是“DEFAULTLIB”?链接器如何决定?我从来没有见过一种方法来指定链接器使用哪个运行时库,只有如何告诉编译器为哪个库创建函数调用。
有“dependency walker”程序可以检查目标文件以查看它们所依赖的DLL。我刚刚在我正在尝试构建的项目上运行了一个,这真是一团糟。有些系统 .libs 和 .dll 需要冲突的运行时版本。例如,COMCTL32.DLL 想要 MSVCRT.DLL,但我链接的是 MSVCRTD.DLL。我正在搜索是否有 COMCTL32D.DLL,即使在我键入时也是如此。
所以我想我要的是一个关于如何整理这些东西的教程。你做什么,你是怎么做的?
这就是我想我知道的。如果有任何错误,请纠正我。
参数为调试/发布、多线程/单线程和静态/DLL。仅涵盖八种可能组合中的六种。没有单线程 DLL,无论是 Debug 还是 Release。
这些设置只影响链接到哪个运行时库(以及与之链接的调用约定)。例如,如果您正在构建 DLL,则不必使用基于 DLL 的运行时,也不必在构建程序的 Debug 版本时使用 Debug 版本的运行时,尽管在单跳过系统调用。
额外的问题:任何人或任何公司怎么会造成这样的混乱?