C++:常見錯誤LNK2019的幾種原因

轉自:https://www.cnblogs.com/thisway/p/5497200.html

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、函數定義沒有放在函數/類聲明的名稱空間中namespace

8、貌似還有不盡之處。http://www.douban.com/note/65638800/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章