vc 常见的编译器警告处理办法

vc 常见的编译器警告处理办法

vc中的警告我们可以在工程属性(property)--c/c++---Advanced-----Disable Specific Warning中加入需要屏蔽的警告号就行,这样处理比较简单;
也可以按照错误原因来依次改正,主要是编译器编译选项参数设置;

warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
原因:BOOL型在windef.h头文件中被定义,其实际类型为int;BOOL其实就是int型变量,与布尔型bool没有什么关系
解决方法:把bool改成大写的BOOL或者bool bSuccess;int iSuccess = 1;bSuccess = iSuccess != 0;

warning C4996: 'sprintf' was declared deprecated see declaration of 'sprintf'
VC6---选项Project | Configuration Properties | C/C++ | Preprocessor | Preprocessor Definitions
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE

VS2005 项目属性---C/++ --->预处理定义下-》配置 -》下面添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE两个宏
或调用VS2005鼓吹的那些带“_s”后缀的非标准函数,即在其后加上"_S",如sprintf_s
或文件最开始:
#define _CRT_SECURE_NO_DEPRECATE
或者在工程属性中设置。

>AFCComDllEx.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:ICF' specification
1>BZZlib.lib(BZZlib.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
1>AFCComDllEx.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:ICF' specification
解决方法:
工程设置->设定->link->link general里边选中Link incrementally

1>TalkMessageFilter.lib(TalkMessageFilter.obj) : error LNK2005: "struct HINSTANCE__ * __stdcall AfxGetInstanceHandle(void)" (?AfxGetInstanceHandle@@YGPAUHINSTANCE__@@XZ) already defined in mfc80d.lib(MFC80D.DLL)
1>   Creating library ..\..\..\sdk\lib\Server\AFCComDllExD.lib and object ..\..\..\sdk\lib\Server\AFCComDllExD.exp
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'mfc80.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'mfcs80.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>..\..\..\run\Server\Debug\AFCComDllExD.dll : fatal error LNK1169: one or more multiply defined symbols found
原因:默认库和使用库发生冲突;在同一个程序中使用不同类型的运行时库或使用调试和非调试版本的运行时库,则将收到此警告。
例如,如果编译一个文件以使用一种运行时库,而编译另一个文件以使用另一种运行时库(例如单线程运行时库对多线程运行时库),
并试图链接它们,则将得到此警告。应将所有源文件编译为使用同一个运行时库。

下表显示根据要使用的运行时库应忽略的库
单线程   (libc.lib)   libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib   
多线程   (libcmt.lib)   libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib   
使用   DLL   的多线程   (msvcrt.lib)   libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib   
调试单线程   (libcd.lib)   libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib   
调试多线程   (libcmtd.lib)   libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib   
使用   DLL   的调试多线程   (msvcrtd.lib)   libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib  
例如,如果收到此警告,并希望创建使用非调试、单线程版本的运行时库的可执行文件,可以将下列选项与链接器一起使用: 
/NODEFAULTLIB:libcmt.lib   /NODEFAULTLIB:msvcrt.lib   /NODEFAULTLIB:libcd.lib   /NODEFAULTLIB:libcmtd.lib   /NODEFAULTLIB:msvcrtd.lib 

终极解决方法:Project/Setting/Link/General中的 Project Options: 加入 /FORCE:MULTIPLE即可。(vc6)
vs2005,在project Property->Configuration Properties->liker->Command  Line加入:/FORCE:MULTIPLE

 

LNK2005: "void __cdecl operator delete(void *)" ( ??3@YAXPAX@Z) already defined in MSVCRT.LIB(MSVCRT.dll)LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRT.LIB
原因:重复定义
解决方法:project -> properties -> linker -> input -> ignore specific library

error C2859: x:\XXX\vc60.pdb is not the pdb file that was used when this precompiled header was created, recreate the precompiled header.
mschart.cpp

Linker Tools Warning LNK4099:下面是msdn上的英文翻译,其实我们可以在linker-Debugging-Generate Debug Info中选No,不要调试信息即可解决
在“object/library”或“path”中未找到   PDB   “filename”;正在链接对象,就像没有调试信息一样
链接器未能找到   .pdb   文件。将该文件复制到包含   object/library   的目录中。
查找与对象文件相关联的   .pdb   文件的名称:  
使用   lib   /extract:objectname.obj   xyz.lib   从库中解压缩对象文件。
使用   dumpbin   /section:.debug$T   /rawdata   objectname.obj   检查   .pdb   文件的路径。
也可以用   /Z7   编译,这样就无需使用   pdb;或者,如果正在链接的对象不具有   .pdb   文件,请移除   /DEBUG   链接器选项
或者configuration Properties | C/C++  | Output Files里的Program Database File Name改为$(IntDir)\$(ProjectName).pdb,
也就是让 静态库pdb不是默认的vc90.pdb,而是跟随项目名称,瞬间, 问题解决,不会反复出现重编译问题.

ado封装成class后,在加入到新的工程时会出现:
error   C2872:   'DataTypeEnum'   :   ambiguous   symbol
error   C2872:   'ParameterDirectionEnum'   :   ambiguous   symbol
在StdAfx.h里把#include <afxdb.h>   // MFC database classes
#include <afxdao.h>   // MFC DAO database classes注释掉就可以了,
因为在添加的ADo类里已经导入类库,再次导入就会重复
  

do.h,ado.cpp等是一个ado封装类 ,较容易使用,流传很广

但是在工程应用或封装为动态库时经常会出现:

:error   C2872:   'DataTypeEnum'   :   ambiguous   symbol

:   error   C2872:   'ParameterDirectionEnum'   :   ambiguous   symbol  

等类似错误,,究其根本是该类型同名出现多个数据库类下,所以我们只要把不需要的数据库支持类去掉即可,因此注释掉stdafx.h里面的dao包含文件即可:

//#ifndef _AFX_NO_DAO_SUPPORT
//#include <afxdao.h>   // MFC DAO database classes
//#endif // _AFX_NO_DAO_SUPPORT

release编译时出错,大家帮看看
fatal   error   C1047:   The   object   or   library   file   '.\release\AbstractFile.obj '   was   created   with   an   older 
  compiler   than   other   objects;   rebuild   old   objects   and   libraries 
解决方法:在Build菜单里面选Rebuild All 或者删除Release目录再编译


vs2008 There was a failure while initializing the Microsoft Visual SourceSafe source control provider. You cannot use this provider to perform source control operations

解决办法:

打开vs2008->tools->options 左边选 source control (若没有这一项 看看左下角的 show all settings 复选框是不是没选上,)然后将右边current source control plug in 下拉列表 选为 none 点击ok


VS2008 MFC添加控件变量的时候,提示脚本出错.原因是ie8和vs2008冲突。
解决方法:打开注册表编辑器,找到“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings\Zones”,在这个项下面新增一个名字为1000的子项,并且在新增的
1000项里添加一个名称为1207的DWORD键,值为0。然后关闭重新打开vs2008,问题解决。


对于VS2005/VS2008 IDE,如果想去掉工程的Unicode属性,编译运行时往往会发生这个错误

MFC错误ERROR C101008A解决方案

错误提示如下:

mt.exe : general error c101008a: Failed to save the updated manifest to the file ".\Debug\Draw.exe.embed.manifest". Bpcn

 

解决方案一:

 

工程——>属性——>清单工具——>命令行——>附加选项——>"/validate_manifest"

解决方案二:
点class view中的工程,选右鍵,再点clean就可以了; 或者是 build->clean solusion也可以。 

你可能感兴趣的:(vc 常见的编译器警告处理办法)