最近在用VS 2008開發,初學遇到不少問題,最頭疼的問題之一就是:LNK2019。
百度一下講的並不夠全面,反正都沒解決我的問題。
error LNK2019問題在VC 6.0中是error LNK2001: unresolved external symbol問題,可能錯誤號改了。
編譯時出現類似這樣的錯誤:Dlgcode.obj : error LNK2019: 無法解析的外部符號 _readRegmark,該符號在函數 _AboutDlgProc@16 中被引用。這種錯誤的本質是鏈接器無法在已編譯的obj、lib或dll文件中找到函數定義。
1、這是百度找到的方法:http://jingyan.baidu.com/article/4d58d54135d7a79dd4e9c0ad.html。就是有頭文件(有了函數聲明)卻沒有lib。一般出現於你使用了第三方提供的庫,下載了頭文件卻忘了載庫文件,或庫文件忘記放到相應的目錄下了。
2、你自己寫的函數聲明的頭文件也寫了函數定義的cpp文件,卻依然出現LNK2019錯誤。可能原因:忘記將這兩個文件加入工程了。一般出現於用Visual Studio和記事本(或UltraEdit)混合開發過程,你用記事本include了相應的頭文件,卻忘了在Visual Studio的工程中加入它們了。也可能出現於在解決方案的開發過程,在解決方案下的某個工程中加入了它們卻忘了在其他工程中加入,我只接觸過VC 6和VS 2008,中間好多年沒用過新版本VS,到2008時突然發現怎么多了個“解決方案”,“解決方案”下面還可以放好多工程,於是經常在一個工程中寫了共享的源代碼,卻忘了在別的工程中加入它們。這個問題類似於第1個,不同的是這個庫是你自己提供的,但沒有把它交給VS 2008編譯出來。
3、你自己寫的函數聲明的頭文件也寫了函數定義的cpp文件也加入工程了而且你很確定函數體肯定是在這個庫文件中,卻依然出現LNK2019錯誤。可能原因:C語言和C++語言混編,因為C++支持函數重載所以C++編譯器生成的庫文件中的函數名會面目全非,例如C編譯器會生成 _readRegmark 這個函數名,而C++編譯器則生成了"void __cdecl readRegmark(char *)" (?readRegmark@@YAXPAD@Z)這么個函數名。當你的函數是用C語言寫的,VS編譯器會按C語言規則編譯,但鏈接器卻不知道還傻傻的用C++規則的函數名去找結果就找不到了,而你還百般肯定TM的不就在這個庫中嗎你個睜眼瞎。解決:在C語言的頭文件中加入
#ifdef __cplusplus extern "C" { #endif void readRegmark(char *regmark); //這里寫函數聲明 #ifdef __cplusplus } #endif
給鏈接器提示這個函數是C語言的,別TM找錯了。
4、這是我百度來的,姑且也放進來。http://blog.csdn.net/jtop0/article/details/5779782。模板聲明和實現要放在同一文件夾中。
5、也是百度來的。http://www.programlife.net/error-lnk2019.html。內聯函數定義在頭文件中。
6、百度的。http://jingyan.baidu.com/article/d621e8da0d7c022864913f40.html。錯誤的工程類型造成的。
7、貌似還有不盡之處。http://www.douban.com/note/65638800/。