VS編程常見的編譯和連結錯誤,vs編程編譯

來源:互聯網
上載者:User

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;


看到了吧?類型是錯誤的,難怪會出錯呢!基礎不紮實,而且也不細心。


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.