似乎我成年后一直被VC++链接器困扰,因为各种库无法达成一致使用运行时库的版本而抱怨或抗拒。 我从未想掌握这个令人沮丧的主题。 所以我只是试图捣鼓,直到它工作为止。 错误消息从来没有用过。 Microsoft的文档对我也不起作用。
有时它找不到函数-因为名称编码不是预期的? 有时它拒绝混合和匹配。 其他时候它只是说:“LINK:警告LNK4098:defaultlib 'LIBCMTD'与其他库的使用冲突;使用/NODEFAULTLIB:library” /NODEFAULTLIB不起作用,但警告似乎是无害的。 “DEFAULTLIB”到底是什么? 链接器是如何决定的? 我从未见过指定链接器要使用哪个运行时库的方法,只知道如何告诉编译器创建哪个库的函数调用。
有“依赖项检查器”程序可以检查目标文件以查看它们所依赖的DLL。 我刚刚在尝试构建的项目上运行了一个,情况很糟糕。 系统.lib和.dll会希望使用不同的运行时版本。 例如,COMCTL32.DLL需要MSVCRT.DLL,但我正在链接MSVCRTD.DLL。 我正在搜索是否有COMCTL32D.DLL,就在我打字的时候。
所以我想要的是如何解决这些问题的教程。 你做什么,怎么做?
这是我知道的。 如果有任何错误,请纠正我。
1. 参数是Debug / Release,Multi-threaded / Single-threaded和static / DLL。 只涵盖八个可能组合中的六个。 没有单线程DLL,无论是Debug还是Release。
有时它找不到函数-因为名称编码不是预期的? 有时它拒绝混合和匹配。 其他时候它只是说:“LINK:警告LNK4098:defaultlib 'LIBCMTD'与其他库的使用冲突;使用/NODEFAULTLIB:library” /NODEFAULTLIB不起作用,但警告似乎是无害的。 “DEFAULTLIB”到底是什么? 链接器是如何决定的? 我从未见过指定链接器要使用哪个运行时库的方法,只知道如何告诉编译器创建哪个库的函数调用。
有“依赖项检查器”程序可以检查目标文件以查看它们所依赖的DLL。 我刚刚在尝试构建的项目上运行了一个,情况很糟糕。 系统.lib和.dll会希望使用不同的运行时版本。 例如,COMCTL32.DLL需要MSVCRT.DLL,但我正在链接MSVCRTD.DLL。 我正在搜索是否有COMCTL32D.DLL,就在我打字的时候。
所以我想要的是如何解决这些问题的教程。 你做什么,怎么做?
这是我知道的。 如果有任何错误,请纠正我。
1. 参数是Debug / Release,Multi-threaded / Single-threaded和static / DLL。 只涵盖八个可能组合中的六个。 没有单线程DLL,无论是Debug还是Release。
这些设置只影响链接到哪个运行库(以及与之链接的调用约定)。例如,如果您正在构建一个DLL,不一定要使用基于DLL的运行时,而构建Debug版本程序时也不必使用Debug版本的运行时,尽管在单步跟踪系统调用时似乎会有所帮助。
奖励问题:任何人或任何公司如何创造出这样的混乱?
答:可能是因为历史原因、技术选择、需求变更等多种因素导致了系统的复杂性和混乱。