我无法测试我的应用程序,因此决定找到更多。这就是情况:我有一个我喜欢在MFC应用程序中使用的第三方静态库。我创建了一个基于MFC对话框的应用程序,它在调试和发布中都成功地构建了。我对MFC单个文档更感兴趣,因此我创建了一个MFC SD应用程序,并像以前一样链接了标题和库。
使用MFC SD应用程序,这些是我得到的:
-
在调试模式下,RT选项设置为"多线程调试DLL(/MDD)",一些LNK2005错误内容。
-
在带有RT选项的调试模式下,将设置为"多线程DLL(/MD)",仅收到几个警告:
链接:警告LNK4098:使用其他libs; use/nodefaultlib:library
defaultlib'msvcrt'冲突链接:警告LNK4098:使用其他libs defaultlib'libcmt'冲突;使用/nodefaultlib:library
-
在发行模式下,将RT选项设置为多线程DLL(/MD)"没有错误或警告。
这些指示什么?这些是预期的吗?该应用程序是否会根据选项2和3?我喜欢首先以调试模式运行我的应用程序进行调试,然后将其转换为发布模式。
为什么MFC SD与对话框在这方面的行为如此不同?
问题在于,您使用的是与不同的CRT选项编译的代码。我确定它是由您引起的。
如果您收到了1. 2之类的警告。它表明,您的一部分代码链接到一个CRT代码平台,而代码的另一部分需要其他CRT代码。
效果是,您有用于Malloc的代码,免费的新,在您的EXE中删除多个版本。因此,您的代码的一个部分可能会用调试核心分配内存,而代码的另一部分则用发行版本释放它...反之亦然。
。或您的代码设置了一个语言环境,并且该语言环境在使用其他CRT的另一个代码部分中不使用...
实际上,如果您不为静态库使用相同的CRT标志,则无法保证您的代码会起作用,并且不会发生奇怪的事情。
只要您拥有静态库的所有设置
- 编译器版本
- 调试/发行
- crt用法(作为dll或static)
- MFC使用(静态或DLL)
必须匹配!