VS編程常見的編譯和連結錯誤,vs編程編譯
常見錯誤1:
Error 2 error LNK1120: 1 unresolved externals
Error 1 error LNK2019: unresolved external symbol __imp__PathFileExistsA@4 referenced in function "public: void __thiscall myspace::RCSetupWithVirtual::StartupSetup(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?StartupSetup@RCSetupWithVirtual@myspace@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
首先我們注意,這是一個連結錯誤。這個錯誤是我在使用PathFileExists這個系統API時候導致的。這樣的錯誤很常見,意思是:識別不了這個外部符號。為什麼會這樣呢?是因為相應的lib檔案沒有包含進來。對於初學者,可能對lib檔案,dll檔案比較陌生。其實很簡單,為什麼我們寫個標頭檔包含比如#include<iostream> 就可以使用裡面的cout和cin函數了呢?其實就是因為我們的電腦有這些函數的實現代碼,只不過它們的標頭檔我們可以看到,源檔案被編譯成lib檔案(靜態連結)或者dll(動態連結)。我們當然就看不到裡面的內容了(都是二進位的)。解決這個問題的方法很簡單,首先去MSDN上搜下你用到的這個API,比如就是PathFileExists這個,裡面有使用這個API的詳細資料:
需要包含的標頭檔,lib檔案。我們需要做的就是把這個lib檔案包含進去。工程屬性---Linker---Input---Additional Dependencies 點擊下拉按鈕選擇Edit,然後直接放進去就好。
繼續編譯試下,就OK了。
常見錯誤2:
Error 2 error LNK1120: 1 unresolved externals
Error 1 error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
或者
Error 2 error LNK1120: 1 unresolved externals
Error 1 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
這是兩種特別常見的錯誤對於初學者,就算是其他程式員,也有時候會寫成這樣。錯誤的意思就是:本來你建工程的時候建立的是控制台工程,結果主函數寫成了WinMain;或者建的是win32工程,主函數寫成了main。 有的人就是重新建立一次工程,這當然是不好的。VS的任何設定都是可以改的,要試著去瞭解這些東西。修改的地方是:工程屬性---Linker---System---SubSystem。這裡注意一個地方,最好的做法是選擇Not Set。為什麼呢?這是《Windows核心編程》裡說明,這樣設定後系統會自動匹配主函數,你寫成什麼工程都可以,這才是完美的辦法啊!
常見錯誤3:
Error 1 error C2664: 'BOOL PathFileExistsW(LPCWSTR)' : cannot convert argument 1 from 'const char *' to 'LPCWSTR‘
原因是我使用了一個這條語句,PathFileExists(fileName.c_str())
PathFileExists的參數類型是LPCTSTR,而fileName是string類型,這就跑到之前的話題string如何轉換成LPCTSTR類型。其實只要使用.c_str()類型就可以,這個函數並不是只對char*有效,它會進行判斷,如果是wchar_t*也會相應的轉換。出現這個錯誤是Character Set的設定問題,很簡單,出現這種錯誤,直接將工程屬性---General---Character Set設定為Not Set即可。統一使用通配類型,符合相容性即可。
********************************************************************************************
自己遇到的錯誤1:
Error 1 error C2664: 'INT_PTR DialogBoxParamA(HINSTANCE,LPCSTR,HWND,DLGPROC,LPARAM)' : cannot convert argument 4 from 'bool (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' to 'DLGPROC'e:\virtualdesktop\virtualdesktop\virtualdesktop.cpp171 VirtualDesktop
2 IntelliSense: argument of type "bool (__stdcall *)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)" is incompatible with parameter of type "DLGPROC"e:\VirtualDesktop\VirtualDesktop\VirtualDesktop.cpp175 VirtualDesktop
怎麼會出現這種錯誤呢?我就寫了個簡單的程式,如下:
bool WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ return false;}int APIENTRY WinMain(HINSTANCE hInstexe, HINSTANCE, PSTR nCmdLine, int nCmdShow){ DialogBox(hInstexe, MAKEINTRESOURCE(IDD_DIALOG1), NULL, Dlg_Proc); return 0;}
只是啟動一個對話方塊,但是就是提示Dlg_Proc這個函數有問題,後來我對比一個正確的代碼發現,原來是函數的返回值bool。正確的返回值是BOOL,這兩個不同嗎?當然是不同的。
typedef int BOOL;
看到了吧?類型是錯誤的,難怪會出錯呢!基礎不紮實,而且也不細心。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。