Visual Studio C++链接器警告:带有C运行时(CRT)的LNK4006

bav*_*aza 3 c++ linker-warning

我要问这个问题,然后自己回答.我知道这是一个新手问题,但是因为它花了我一个大概.两天找到正确的答案,无论如何我都会发布.

对免责声明这么多 - 这个是专门为你们所有的新手而设的:

我在VS 2010中去了一个MFC项目,我需要添加一些第三方静态库.一切顺利,两个项目都编译完成,我的项目设法引用了库.然后,当我从包含在我的项目库中的一些头文件,我得到了无数的一个链接器警告,大约在C运行时库,如功能:

警告9警告LNK4006:_sprintf在libcmtd.lib(sprintf.obj)已经定义; 第二个定义被忽略C:路径\为\我的\项目\ MSVCRTD.LIB(MSVCR100D.dll)

思考"什么是地狱",我试图运行我的项目,才运行,直到它遇到了哪些尝试写入使用"fostream"一些文件,然后将其与一些可怕的堆损坏异常崩溃的代码行.

在搜索SO时,我遇到了一些相关的问题,其中没有一个与我的问题完全匹配:

在我偶然发现答案之前,我几乎将外部库包装在一个dll中.

bav*_*aza 5

我很高兴的结局是,我偶然发现了Microsoft支持文章中的正确答案:如何链接到正确的C运行时(CRT)库.

显然,我违反了以下规则,如明文所述:

可重用库及其所有用户应使用相同的CRT库类型,因此使用相同的编译器开关.

这意味着我应该为项目和第三方库使用相同的C运行时(CRT)库.在VS 2010中选择CRT可以通过以下方式完成:右键单击project_name - > properties(属性窗口打开) - > C/C++ - >代码生成 - >运行时库.根据文章中的表(单线程,静态多线程或dll多线程,发布或调试),使用下拉列表并选择运行时库.

配置完所有项目后,重新编译它们,并且(希望)警告消失了.