1. 程式人生 > >LNK2001: 無法解析的外部符號的幾種情況

LNK2001: 無法解析的外部符號的幾種情況

一般來說,我們引用第三方庫時,需要進行指定依賴項配置,若沒有進行相關配置,則編譯器會出現“LNK2001: 無法解析的外部符號”錯誤。

這個是最常見的問題,具體步驟
專案、屬性、連結器、常規、附加庫目錄:填寫附加依賴庫所在目錄 分號間隔多項
專案、屬性、連結器、輸入、附加依賴項:填寫附加依賴庫的名字.lib 空格或分號間隔多項

若已經按照上述步驟進行配置,但編譯器還是報錯,可能情況如下:

1.編譯lib庫和引用lib庫平臺不一致

lib庫採用的編譯平臺和引用該lib的工程的編譯平不相容導致的。比如專案採用vs2008編譯,而該lib是用2010編譯的,亦或者專案採用vs2015平臺,而lib是vs2008編譯的也可能導致連結失敗。

2.編譯lib庫和引用lib庫選項不一致情況

1、一個lib庫採用“多執行緒 DLL (/MD)”配置,而另外一個專案採用“多執行緒(/MT)”編譯配置
2、一個lib庫採用“使用 Unicode 字符集”配置,而另外一個專案採用“使用多位元組字符集”編譯配置
3、一個lib庫採用選擇“release 版本 ”配置,而另外一個專案採用選擇 “debug 版本 ”編譯配置
4、一個lib庫採用“wind32平臺 ”配置,而另外一個專案採用“wind64平臺 ”編譯配置

3.沒有新增指定預編譯巨集

在使用curl靜態庫時,卻遇到了編譯連結錯誤:
1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_init
1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_setopt
1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_perform
1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_cleanup

解決方法是,在自己的專案屬性中新增一個預編譯巨集,CURL_STATICLIB,

為了避免遇到以上問題建議:

1、引用第三方庫時,確認lib庫是否使用相同編譯平臺
2、確認編譯選項是否一致。比如執行時庫和字符集
3、若需要則新增指定編譯巨集
4、新增附加庫目錄和附加依賴項