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也可以。