c++ - Visual Studio C++ 链接器警告 : LNK4006 with C Run-Time (CRT)

标签 c++ linker-warning

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

免责声明就这么多了——这个是献给所有新手的:

我在 VS 2010 中创建了一个 MFC 项目,我需要添加一些第 3 方静态库。一切顺利,两个项目都已编译,我的项目也成功引用了该库。然后,当我在我的项目中包含库中的一些头文件时,我收到了大量关于 C 运行时库中函数的链接器警告,例如:

警告 9 warning LNK4006: _sprintf already defined in libcmtd.lib(sprintf.obj);第二个定义被忽略 C:path\to\my\project\MSVCRTD.lib(MSVCR100D.dll)

我想“到底是怎么回事”,我尝试运行我的项目,它确实运行了,直到遇到试图使用“fostream”写入某个文件的代码行,然后它因一些可怕的堆损坏异常而崩溃.

搜索 S.O.,我遇到了一些相关问题,但没有一个与我的问题完全匹配:

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

最佳答案

我的大团圆结局是我在 Microsoft 支持文章中偶然发现了正确答案:How to link with the correct C Run-Time (CRT) library .

显然,我违反了文章中所述的以下规则:

A reusable library and all of its users should use the same CRT library types and therefore the same compiler switch.

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

配置所有项目后,重新编译它们,(希望)警告消失。

关于c++ - Visual Studio C++ 链接器警告 : LNK4006 with C Run-Time (CRT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4236747/

相关文章:

c++ - 将一个 constexpr 数组初始化为其他两个 constexpr 数组的总和

c++ - 'LIBCMT' 与使用其他库 + 未解析的外部符号冲突

iphone - Xcode——库的链接器警告——Debug-iphonesimulator 与 Debug-iphoneos

objective-c - Xcode/clang : Why do some, 不是全部,我的标题给 "warning: no rule to process file xxx for architecture arm7"

c++ - 类 undefined reference

c++ - 空终止字符数组(c 字符串)没有 for 循环不打印

c++ - int[n][m],其中 n 和 m 在运行时已知

c++ - LNK4075 : ignoring '/EDITANDCONTINUE' due to '/OPT:ICF' specification

c++ - 插入的项目从 boost::mpl::map 中消失

c++ - 如何使用boost单例