一、Error LNK2019: 無法解析的外部符號
此問題應該是Visual Studio的初學者最常碰到的問題,也是相對來說很讓人頭疼的問題。
注:Error LNK2019 問題在VC 6.0 中是 error LNK2001: unresolved external symbol 問題。
此問題出現在編譯的時候,例如:Dlgcode.obj : error LNK2019: 無法解析的外部符號 _readRegmark,該符號在函數 _AboutDlgProc@16 中被引用。
這種錯誤的本質是鏈接器無法在已編譯的obj、lib或dll文件中找到函數定義。下面是可以嘗試的解決方案:
1. 檢查項目中是否是只有頭文件(有了函數聲明)卻沒有lib。一般出現於你使用了第三方提供的庫(當然如果庫是自己寫的,也會這樣,重點是沒有導入lib),下載了頭文件卻忘了載庫文件,或庫文件忘記放到相應的目錄下了。
2. 如果進行上面的檢查后發現並沒有問題,頭文件沒問題,cpp文件也沒問題,相應的庫都正常引入了,但是依舊出現LNK2019錯誤。此時我們就應該從代碼層面去排查問題了。很有可能是C語言和C++語言混編導致的問題。因為C++支持函數重載,所以C++編譯器生成的庫文件中的函數名會面目全非。
例如C編譯器會生成 _readRegmark 這個函數名,而C++編譯器則生成了"void __cdecl readRegmark(char *)" (?readRegmark@@YAXPAD@Z)這么個函數名。
當你的函數是用C語言寫的,VS編譯器會按C語言規則編譯,但鏈接器卻不知道還傻傻的用C++規則的函數名去找結果就找不到了。
解決辦法:在C語言的頭文件中加入extern "C",代碼方式如下:
extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavcodec/avcodec.h" #include "libswscale/swscale.h" #include "libavutil/imgutils.h" #include <libswresample/swresample.h> #include "SDL.h" }