静态库调试与发布

时间:2014-03-13 06:42:46

标签: visual-studio-2008 mfc

我无法测试我的应用程序,因此决定了解更多信息。情况就是这样:我有一个第三方静态库,我喜欢在我的MFC应用程序中使用它。我创建了一个基于MFC对话框的应用程序,它在调试和发布中都成功构建。我对MFC单文档更感兴趣,因此我创建了一个MFC SD应用程序并将标题和库链接起来,然后开始构建。

使用MFC SD应用程序,这些是我得到的:

  1. 在调试模式下,RT选项设置为"多线程调试DLL(/ MDd)",得到了 一些LNK2005错误的东西。

  2. 在RT选项设置为"多线程DLL(/ MD)"的调试模式下,仅收到几个警告:

    LINK:警告LNK4098:defaultlib' MSVCRT'与使用其他库冲突;使用/ NODEFAULTLIB:库

    LINK:警告LNK4098:defaultlib' LIBCMT'与使用其他图书馆的冲突; use / NODEFAULTLIB:library

  3. 在发布模式下,RT选项设置为多线程DLL(/ MD)"没有错误或警告。

  4. 这些表明了什么?这些都是预期的。该应用程序是否可以在选项2和3下工作?我希望能够首先在调试模式下运行我的应用程序进行调试,然后将其转换为发布模式。

    为什么MFC SD与基于对话的行为在这方面的表现如此不同?

1 个答案:

答案 0 :(得分:0)

问题是您使用使用不同CRT选项编译的代码。我确信它是由你的静态lib引起的。

如果你收到1 + 2以下的警告。它表明您的一部分代码链接到一个CRT代码平台,而代码的其他部分需要其他CRT代码。

效果是,你有exeoc的代码,免费的新的,删除你的exe中的几个版本。因此,代码的一部分可能会使用调试内核分配内存,而另一部分代码会使用发布版本释放它...反之亦然。

或者您的代码设置了区域设置,并且此区域设置不在另一个使用不同CRT的代码部分中使用...

事实上,如果您不对静态库使用相同的CRT标志,则无法保证您的代码可以正常工作,并且不会发生奇怪的事情。

只要您拥有静态库

的所有设置
  • 编译器版本
  • 调试/发布
  • CRT用法(作为DLL或静态)
  • MFC用法(静态或DLL)

必须匹配!