這篇文章主要用來記錄使用Visual Studio過程中,出現的各種error,並提供自己當時解決的方案。
但是,一個error可能由不用原因引起的,文中案例僅供大家參考。
-
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
解決:將工程設置為Using MFC in static library -
cannot open file "mfc42u.lib"
解決:安裝vc時沒有安裝Unicode版本(默認是不安裝的),可以下載幾個庫文件copy到vc98/MFC/Lib,或者build選擇非Unicode版本編譯(也可以在Set Configuation中配置Unicode相關刪除) -
fatal error RC1107: invalid usage; use RC /? for Help
解決:查看vc++目錄是否有問題
<1>將附加額外目錄暫時移至工程末尾
<2>把其中的反斜線(/)替換為雙反斜線(//)或者替換為斜線 -
LINK : fatal error LNK1000: Internal error during IncrBuildImage
解決:<1> 項目(Project)->屬性(Property)->鏈接器(Linker)->常規(General) 下面的“啟用增量鏈接(Enable Incremental Linking)”,將“是(/INCREMENTAL)”改為“否(/INCREMENTAL:NO)”。不過這又引入了另外一個警 告:FormatCom.obj : warning LNK4075: 忽略“/EDITANDCONTINUE”(由於“/INCREMENTAL:NO”規范)。
<2> 選擇項目,屬性(Property pages)->配置屬性(Configuration Properties) ->C/C++,修改“調試信息格式(Debug Information Format)”為“程序數據庫(Program Database(/Zi))”即可。 -
LINK1123:failure during conversion to COFF:file invalid or corrup
解決:將C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe目錄下的cvtres.exe文件用C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe代替 -
error c2064:項不會計算為接受1個參數的函數
解決:可能是運算符乘號未寫 -
error c2228:"Grade"左邊必須有類/結構/聯合
解決:不一定是左邊的類結構問題,前一語句缺少“;”也會導致這個錯誤。 -
error C2440: “=”: 無法從“const char [11]”轉換為“LPCWSTR”
解決:vc6.0運行沒問題,vs2005之后默認Unicode字符集,可將其改為Muti-bye。 -
error LNK2019:無法解析的外部符號 _main,該符號在函數 ___tmainCRTStartup 中被引用
解決:建錯工程了,應該是win32 application(window應用程序)
win32 application和win32 Console Application區別:
win32 application就是普通的常見的窗口應用程序
win32 Console Application就是MS-DOS窗口(命令提示符) -
error C4996:'sprintf':This fuction or variable may be unsafe
解決:將‘sprintf’改為‘sprintf_s’,警告就不會再有了。
很多函數不進行參數檢測(越界類等...),微軟擔心使用這些會造成內存異常,所以就改寫了同樣的功能的函數,改寫的函數進行了參數的檢測,使用這些新的函數會更安全和便捷。一般只需加_s就行。 -
error C2084: 函數“XXXXXX“已有主體
解決:檢查是否有重名的函數定義 -
error C2065:'hInstance,NULL' : undeclared identifier
解決:主要是“,”是中文字符照成的,可能還會報warning C4003: not enough actual parameters for macro 'CreateWindowA'錯 -
致命錯誤 RC1015: 無法打開包含文件 'afxres.h'
解決:實際上這個問題很多情況下是由於路徑設置的問題引起的
executatble files:C:\Program Files\Microsoft Visual Studio\Common\MSDev98\BinC:\Program Files\Microsoft Visual Studio\VC98\BINC:\Program Files\Microsoft Visual Studio\Common\TOOLSC:\Program Files\Microsoft Visual Studio\Common\TOOLS\WINNT
include files:C:\Program Files\Microsoft Visual Studio\VC98\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE
library files:C:\Program Files\Microsoft Visual Studio\VC98\LIBC:\Program Files\Microsoft Visual Studio\VC98\MFC\LIB
source files:C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRCC:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC -
error C2065: ‘xxxxxxxx’:undeclared identifier
解決:很多是因為“;”或者其他符號是中文下輸入,造成的。 -
error C2653: is not a class or namespace name
解決:沒建立一個新類都要在.cpp文件中加入#include "stdafx.h",而且要加在第一行,
編譯器通過一個頭文件stdafx.h 來使用預編譯頭文件。 -
缺失return經常會使彈出內存操作錯誤
解決:理清程序結構,找到漏寫的返回值。 -
First-chance exception in main.exe: 0xC0000005: Access Violation.
解決:訪問違例,使用空間,但是未申請,也可能在使用之前被delete了。 -
LINK : fatal error LNK1168: cannot open Debug/ling.exe for writing
解決:結束ling.exe進程。 -
error LNK2001: 無法解析的外部符號 "public: void __thiscall CSketcherView::OnColorBlack
解決:OnColorBlack在源文件中未寫 -
菜單響應函數消息類型不見了!
解決:直接刪除.ncb文件 -
error LNK2019 : unresolved external symbol __imp__PlaySoundW@12 referenced in function _WinMain@16
解決:#pragma comment(lib,"winmm.lib") -
please enter the path for mfcs42d.pdb
解決:將debug文件夾內容全部刪除 -
調試錯誤 ASSERTE(_CrtIsValidHeapPointer(pUserData))
解決:delete 野指針前給指針賦空 -
無法啟動此程序 ,因為計算機中丟失MFC80UD.DLL
解決:把工程debug下文件全部刪除,然后rebulid project -
VC6.0 error LNK2001: unresolved external symbol _main
解決:[Project] --> [Settings] --> 選擇"Link"屬性頁, 在Project Options中將/subsystem:console改成/subsystem:windows -
fatal error RC1004: unexpected end of file found
解決: 頭文件里少了結尾的回車 -
vc助手寫到一般時突然沒有提示了
解決:可能是前面有哪句寫錯了,然后導致后面識別的全是字符 -
File f:/dd/vctools/vc7libs/ship/atlmfc/src/mfc/viewscrl.cpp, Line 385
解決:需要在類開時時,增加SetScrollSizes ( MM_TEXT,CSize (0 , 0 ) ); -
error C2668: 'sqrt' : ambiguous call to overloaded function
解決:sqrt處理類型必須是double -
error C2144:syntax error : 'char' should be preceded by ';'
解決:如果在 a.h 里缺少分號, 則編譯器會在 b.h 中會提示錯誤. 所以要在 a.h 中找錯誤 -
<dshow.h>無法打開
解決:vs編譯器沒有包含dx的drawshow中的include、lib -
fatal error C1001: An internal error has occurred in the compiler.
解決:清理解決方案,然后build -
源文件與模塊生成時的文件不同
解決:清空解決方案,重新生成解決方案 -
error LNK2001: 無法解析的外部符號 "public: virtual void __thiscall CDib::GetTmplPos(void)" (?GetTmplPos@CDib@@UAEXXZ)
解決:虛函數格式錯誤,必須在源文件函數后加{} -
x.exe中的0x77dd15de處有未經處理的異常:0xC015000F:正被停用的激活上下文不是最近激活的
解決:在Visual Studio中,選擇Debug | Exceptions菜單項,在彈出的對話框中,勾選所有的Win32 Exceptions。這樣就有機會在第一時間(異常處理前)看到自己的代碼中發生了什么錯誤而導致拋出異常,從而改正錯誤,消除程序中的隱患。
(注:可能是析構函數中釋放並未初始化的變量) -
在VC++6.0中出現failed to (or don't know how to) build 'D:\VC98\MFC\SRC\APPMODUL.CPP'
解決:系統目錄設置問題:找到××.dsp文件(××為工程名),用記事本打開,找到如下:SOURCE="D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\APPMODUL.CPP" # End Source File # Begin Source File對SOURCE修改。 -
error C2146: syntax error : missing ';' before identifier 'PVOID64'
解決:將VS編譯器環境中directdraw包含文件和包含庫調至默認庫下方.
vs中會先加載項目屬性中的包含文件和庫,再加載vs本身配置的屬性。
所以,導致有些對庫包含順序有要求的庫文件出錯。——也就是說,directdraw不能在項目屬性中設置 -
LINK :fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
解決:項目-->工程屬性->配置屬性-> 清單工具->輸入和輸出->嵌入清單,選擇[否] -
fatal error C1033: cannot open program database 'e:\實驗室工程\newassistivev
解決:將文件夾換成可讀寫狀態 -
fatal error C1001: An internal error has occurred in the compiler.
解決:將解決方案清理,再重建(因為解決方案不是最新的) -
彈出不能找到“SpeechRecognizeBase.h”等文件
解決:將項目屬性的鏈接和附加目錄修改好 -
fatal error C1083:NO such file or directory
解決:項目屬性附加目錄添加:$(ProjectDir),表示當前工程目錄 -
顯示未聲明某變量
解決:確認是否有,如果其在另一關聯文件定義了,注意要用extern聲明該變量。 -
斷點無效
解決:1)清空生成的解決方案,重新生成
2)將工具->選項->調試里->常規 找到 要求原文件與原始版本完全匹配 不要打勾
(此方法最后試用) -
vc80.pdb
解決:將文件路徑全部改成英文 -
error C2143: syntax error : missing ';' before '<'
error C2433: 'CDib:: vector' : 'virtual' not permitted on data declarations
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2238: unexpected token(s) preceding ';'
解決:使用vector,未寫using namespace std; -
LINK : fatal error LNK1104: 無法打開文件“ejTTS.lib”
解決:將鏈接器中的附加庫目錄修改為正確的路徑 -
chkstk.asm 錯誤
解決:在項目-》屬性-》配置屬性-》鏈接器-》系統,將堆棧保留大小弄大點,如50M(52428800)是堆太小加載溢出(如數組buffer定義的太大就會造成此現象) -
error C2065: 'IDD_DIALOG_WNDSIZE': undeclared identifier
解決:將resources.h包含到該對話框頭文件中來 -
當編譯后,按F5進行調試,斷點無效(或有效,但是位置亂跳)
解決:勾選 工具-》調試-》常規 要求源文件與原始版本完全匹配 -
程序通過VS編譯器F5運行可以,直接點擊exe運行不正常
解決:寫絕對路徑,問題就會消失。
缺省情況下:調試時使用的工作目錄是你的項目所在的目錄。而直接運行時,是你的可執行文件所在的目錄。
(有則有,無則無,不會無中生有,定是另有乾坤) -
加入某些資源文件在最終程序中是有效果的,但是又用vs搜尋其ID不到
解決:清理解決方案,重新生成解決方案 -
cannot convert parameter 1 from 'const char *' to 'LPCWSTR'
解決:將字符串用_T()轉換或修改字符集為多字節字符集(vs05默認為UNICODE)
注:_T()包含在tchar頭文件里 -
error C4430: missing type specifier - int assumed. Note: C++ does not
解決:給函數聲明加上返回類型
注:vc6.0默認類型為int型,而vs不會這么做,所以會報錯。 -
放在桌面(win8)的工程文件無法生成動態鏈接庫DLL
解決:將工程移置其他目錄嘗試
(未知根源,關閉工程時還會報無法保存項目設置信息) -
生成的dll無法起到效果
解決:注意系統有分64和32,64位程序必須調用64的dll
(用相應的平台生成dll文件) -
warning C4786: std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std:: char_traits<char>,std::allocator<char> > const &,std::basi。。。
解決:在#include <vector>前加上 #pragma warning(disable:4786),強制去除警告
注:vc6.0對vector支持不是很好,所以才會出現此警告。 -
please enter the path for mfcs42d.pdb 提示解決方法
解決:Project settings | Link | Debug, 不選 "Separate types"。然后,rebuild all。重新把Separate types 勾選上。
59.LINK : fatal error LNK1104: 無法打開文件“Log.lib xxx.lib xxx.lib”
解決:VS10庫包含之間是用“;”隔離開來的,VC6.0是用空格。
-
R6010 abort() has been called
解決:一般是指針訪問越界導致的,仔細檢查是否有內存寫入失敗,依然會當作成功取獲取指針,並讀取未寫入任何信息的內存控件。 -
error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
解決:將“Configuration”-“General”中Configuration Type修改為Dynamic Library(.dll)
原因:由於自己是要編譯DLL工程,沒有相應的啟動入口函數。 -
error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead.
解決:在預處理器定義中添加_CRT_SECURE_NO_WARNINGS
或者新建工程時不勾選:安全開發生命周期(SDL)檢查
原因:因為很多版本都沒有使用安全函數,為減少改動,關閉相關檢查。 -
new xxx
一個自建類時,彈錯:應輸入類型說明符
。
解決:這種情況基本時函數或變量名與new
的那個類同名造成的,將函數同名函數或者同名變量名修改下就可以了。
解析:編輯器不是萬能的,我們不能自以為編譯器可以處理什么,而是要了解編譯器處理邏輯,並知道哪些時編譯器處理不了的。這個時候就很體現平常良好的編程習慣的好處了,我們一般變量名會全部小寫,類首字母大寫,這樣就完全不會出現變量名和類名重名的情況。