Visual Studio 開發(三):Visual Studio 使用時常見問題解決方案

1、Error LNK2019: 沒法解析的外部符號 

此問題應該是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"
}
相關文章
相關標籤/搜索