VS編譯時一些常見錯誤積累LNK,比如LNK2019、LNK2001(實時更新)

1. lnk2019

       LNK2019錯誤一般是 compile 能找到 header(.h)文件,但是在鏈接時找不到需要的 lib 庫文件或者是 dll 文件

一般認爲在編譯 OSG 簡單示例的時候遇到這樣的錯誤是因爲錯誤的設置了 lib2。OSG 的 lib 目錄中一般有兩組文件名相似的 lib 文件,其中一組以 d 結尾,例如:osgDBd.lib, osgViewerd.lib,這個表示該 lib 是用於調試 debug,而不帶 d 的一組是用於 release 版本。

如果沒有正確的指定 lib 文件,那麼一般會出現 error LNK2019 錯誤。比如,編譯時指定的是 debug, 但是依賴項設置的卻是不帶 d 的那一組 release 版本的 lib 文件;或者是編譯時指定 debug,但是依賴項設置的是帶 d 的一組。只要編譯的選項和調用的 lib 一致即可解決這個問題。

不過我仔細檢查了自己調用的 lib,編譯的選項和調用的 lib 都是 debug 版本的。

後來發現,開發機器是64位的,而編譯選項的目標平臺(platform)選擇的卻是 win32,修改爲 x64 之後解決了這個鏈接錯誤。

也看到有人說1,前面函數聲明與後面的函數定義參數類型不同時,有時 compile 能夠通過,但是 link 的時候會出現 error LNK2019 錯誤。

參考鏈接:

  1. error LNK2019: unresolved external symbol
  2. 求助:最簡單的OSG例子編譯出錯
  3. error LNK2019: unresolved external symbol "__declspec(dllimport)

2. lnk2001

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

這個是最常見的問題,具體步驟:

        項目->屬性->鏈接器->常規->附加庫目錄:填寫附加依賴庫所在目錄(分號間隔多項);

        項目->屬性->鏈接器->輸入->附加依賴項:填寫附加依賴庫的名字.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,
      

    4.如果上述3點都沒能解決這個問題,則把源文件添加進工程,這是迫不得已之法,但也是最根本的解決之道!

 

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

          1)引用第三方庫時,確認lib庫是否使用相同編譯平臺 

          2)確認編譯選項是否一致,比如運行時庫和字符集

          3)若需要則添加指定編譯宏

          4)添加附加庫目錄和附加依賴項 

參考鏈接:

     https://blog.csdn.net/c_base_jin/article/details/83010745 

3. error C2001: newline in constant

     這個錯誤開發中難免會遇到

     一是可能由於疏忽可能括號、引號等不匹配造成;

     二是由於編碼方式引起,解決:由於包含漢子,將其文本編碼改爲utf8.或者 將源碼文件用其它編輯器打開,保存爲utf8+bom編碼格式。

     注意:有時有的中文標點同樣會報錯。

參考鏈接:

     https://blog.csdn.net/allen807733144/article/details/85243819

     https://blog.csdn.net/lpy369369/article/details/86776690

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章