我要问这个问题,然后自己回答。 我知道这是一个新手问题,但是因为它花了我一个大概。两天找到正确的答案,无论如何我都会发布。
对于免责声明而言,这一点非常适合所有新手:
我在VS 2010中使用了MFC项目,我需要添加一些第三方静态库。一切顺利,两个项目都编译完成,我的项目设法引用了库。然后,当我在项目中从库中包含一些头文件时,我收到了许多链接器警告,关于C运行时库中的函数,例如:
警告9警告LNK4006:_sprintf已在libcmtd.lib中定义(sprintf.obj);第二个定义忽略C:path \ to \ my \ project \ MSVCRTD.lib(MSVCR100D.dll)
思考'到底是什么',我尝试运行我的项目,它确实运行,直到它遇到一个代码行试图使用'fostream'写入某个文件,然后它崩溃了一些可怕的堆损坏异常
搜索S.O.,我遇到了一些相关的问题,其中没有一个问题完全符合我的问题:
在我偶然发现答案之前,我差点将外部库包装在dll中。
答案 0 :(得分:5)
我的结局是,我在微软支持文章How to link with the correct C Run-Time (CRT) library中偶然发现了正确的答案。
显然,我违反了以下规则,如明文所述:
可重用库及其所有用户应使用相同的CRT库类型,因此应使用相同的编译器开关。
意味着我应该为项目和第三方库使用相同的C运行时(CRT)库。在VS 2010中选择CRT可以通过以下方式完成:右键单击project_name - >属性(属性窗口打开) - > C / C ++ - >代码生成 - >运行时库。根据文章中的表格(单线程,静态多线程或dll多线程,发布或调试),使用下拉列表并选择运行时库。
配置好所有项目后,重新编译它们,并且(希望)警告消失了。