我要问这个问题,然后自己回答。 我知道这是一个新手问题,但因为它花了我大约。两天找到正确答案,无论如何我都会发布。
免责声明就这么多了——这个是献给所有新手的:
我在 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.,我遇到了一些相关问题,但没有一个与我的问题完全匹配:
- Link libraries with dependencies in Visual C++ without getting LNK4006
- How do you build a debug .exe (MSVCRTD.lib) against a release built lib (MSVCRT.lib)?
在我偶然发现答案之前,我几乎将外部库包装在一个 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/