【问题标题】:Visual Studio C++ linker warning: LNK4006 with C Run-Time (CRT)Visual Studio C++ 链接器警告:带有 C 运行时 (CRT) 的 LNK4006
【发布时间】:2010-11-21 06:37:21
【问题描述】:

我要问这个问题,然后自己回答。 我知道这是一个新手问题,但我花了大约。两天找到正确答案,我还是贴吧。

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

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

警告 9 警告 LNK4006:_sprintf 已在 libcmtd.lib(sprintf.obj) 中定义;第二个定义忽略 C:path\to\my\project\MSVCRTD.lib(MSVCR100D.dll)

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

搜索 S.O.,我遇到了一些相关的问题,没有一个完全符合我的问题:

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

【问题讨论】:

    标签: c++ linker-warning


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多