不管哪种做法是好是坏,这是否是对所允许规则的正确总结? (我的推理在底部给出)
(1)不管您的应用程序是使用/ MT还是/ MD构建的,即使它是使用不同版本的C / C ++运行时构建的,也可以与/ MT构建的库静态链接。
>(2)不管您的应用程序是使用/ MT还是/ MD构建的,都可以与任何DLL库动态链接(即,与该文件的DLL-stub导入库链接),即使该应用程序是使用其他构建的。版本的C / C ++运行时。
(3a)如果您的应用程序是使用/ MT构建的,则不能与使用/ MD构建的库静态链接。
(3b)如果您的应用程序是使用/ MD构建的,则只有在与/ VC应用程序相同版本的MSVCRT链接的情况下,才能与/ MD构建的库静态链接。
(4)在涉及不同版本的C / C ++运行时的任何情况下,都必须注意不要在另一个库版本的功能中使用一个库版本分配的数据结构。
我的推理:
(1)当静态链接到使用/ MT构建的库时,该库将嵌入其自己所需的C / C ++运行时函数的副本。因此,您可以将所有代码嵌入代码中,并根据需要调用自己的C / C ++运行时和其他功能,而无需考虑应用程序的C / C ++运行时库中发生的情况。
(2)动态链接时,您无需假设链接的DLL会做什么。
(3a)将/ MT应用程序与/ MD库静态链接是没有意义的,因为通过链接应用程序/ MT,您是说所有C / C ++运行时调用都是通过调用应用程序中嵌入的函数来解决的。但是/ MD库(您也通过静态链接将其代码嵌入到您的应用程序中)表示,它想通过调用DLL来解决那些相同的C / C ++运行时调用。 (我真的不确定我的理由。)
(3b)如果您的应用程序已经在调用DLL以进行C / C ++运行时调用,则可以从库中嵌入代码,该库也可以为这些C / C ++运行时调用而调用DLL,但是必须同意他们正在调用哪个版本。
(4)例如,如果第一个库使用C / C ++运行时版本A,并且您调用了一个将FILE *返回到应用程序的库,然后在应用程序中使用该FILE *或将其传递给另一个库,应用程序或第二个库使用运行时版本B,如果这两个版本的FILE结构不同,则会遇到问题。另一个问题是让一个库在其堆空间中分配内存,并将该句柄传递给另一个库。