此問題應該是Visual Studio的初學者最常碰到的問題,也是相對來講很讓人頭疼的問題。函數
注:Error LNK2019 問題在VC 6.0 中是 error LNK2001: unresolved external symbol 問題。spa
此問題出如今編譯的時候,例如:Dlgcode.obj : error LNK2019: 沒法解析的外部符號 _readRegmark,該符號在函數 _AboutDlgProc@16 中被引用。code
這種錯誤的本質是連接器沒法在已編譯的obj、lib或dll文件中找到函數定義。下面是能夠嘗試的解決方案:orm
1. 檢查項目中是不是隻有頭文件(有了函數聲明)卻沒有lib。通常出現於你使用了第三方提供的庫(固然若是庫是本身寫的,也會這樣,重點是沒有導入lib),下載了頭文件卻忘了載庫文件,或庫文件忘記放到相應的目錄下了。blog
2. 若是進行上面的檢查後發現並無問題,頭文件沒問題,cpp文件也沒問題,相應的庫都正常引入了,可是依舊出現LNK2019錯誤。此時咱們就應該從代碼層面去排查問題了。頗有多是C語言和C++語言混編致使的問題。由於C++支持函數重載,因此C++編譯器生成的庫文件中的函數名會面目全非。編譯器
例如C編譯器會生成 _readRegmark 這個函數名,而C++編譯器則生成了"void __cdecl readRegmark(char *)" (?readRegmark@@YAXPAD@Z)這麼個函數名。io
當你的函數是用C語言寫的,VS編譯器會按C語言規則編譯,但連接器殊不知道還傻傻的用C++規則的函數名去找結果就找不到了。編譯
解決辦法:在C語言的頭文件中加入extern "C",代碼方式以下:form
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" }