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


一、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"
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM