3

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

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

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

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

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

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

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

4

1 回答 1

5

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

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

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

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

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

于 2010-11-21T07:07:16.117 回答