當前位置:編程學習大全網 - 編程語言 - 詭異的連接錯誤error LINK2019 2001

詭異的連接錯誤error LINK2019 2001

路徑壹定要做正確~爭取默認,全英文~~

造成LNK2001原因非常多,有時LNK2019就是造成LNK2001的原因~~

要盡量規範代碼,以及路徑正確性~~

壹、代碼問題

1.如果 LNK2001 診斷文本報告 __check_commonlanguageruntime_version 是無法解析的外部符號,在 function 中找到了未定義的外部符號 (symbol)。若要解決此錯誤,請提供符號定義或移除引用它的代碼。

2.成員模板的定義超出了類的範圍。Visual C++ 的壹個限制是,成員模板的定義必須完全位於封閉類內。

3.代碼中大小寫不匹配

4.如果項目使用函數內聯,但在 .cpp 文件而非頭文件中定義函數,則會導致 LNK2001。

5.試圖引用沒有外部鏈接的函數或數據會導致 LNK2001。

6.缺少函數主體或變量會導致 LNK2001。

7.調用參數類型與函數聲明中的參數類型不匹配的函數會導致 LNK2001。名稱修飾將函數參數合並到最終修飾函數名中。

8.錯誤包含的原型導致編譯器需要沒有提供的函數體,這樣會導致 LNK2001。如果同時具有函數 F 的類實現和非類實現,請註意 C++ 範圍解析規則。

9.在使用 C++ 時,將函數原型包含在類定義中但未能包含實現(該類的此函數的實現)會導致 LNK2001。

10.試圖從抽象基類的構造函數或析構函數調用純虛函數會導致 LNK2001。純虛函數沒有基類實現。

11.試圖在函數範圍外使用用該函數聲明的變量(局部變量)會導致 LNK2001。

二、編譯和鏈接問題

1.項目缺少對庫 (.LIB) 或對象 (.OBJ) 文件的引用。有關更多信息,請參見用作鏈接器輸入的 .lib 文件。

2.如果使用 /NODEFAULTLIB 或 /Zl,包含所需代碼的庫將不會鏈接到項目,除非已顯式地包括了這些庫。(在使用 /clr 或 /clr:pure 進行編譯時,您將看到對 .cctor 的引用;有關更多信息,請參見 混合程序集的初始化。)

3.如果正在使用 Unicode 和 MFC,如果沒有創建 wWinMainCRTStartup 的入口點,將在 _WinMain@16 上得到無法解析的外部對象;請使用 /ENTRY。請參見 Unicode 編程摘要。

4.將用 /MT 編譯的代碼與庫 LIBC.lib 鏈接會在 _beginthread、_beginthreadex、_endthread 和 _endthreadex 上導致 LNK2001。

5.鏈接需要多線程庫的代碼(任何 MFC 代碼或用 /MT 編譯的代碼)會在 _beginthread、_beginthreadex、_endthread 和 _endthreadex 上導致 LNK2001。有關更多信息,請參見下列知識庫文章:

6.在用 /MD 進行編譯時,因為所有的運行時現在都存放在壹個 DLL 中,所以源中的“func”引用在對象中變為“__imp__func”引用。如果試圖與 LIBC.lib 或 LIBCMT.lib 靜態庫鏈接,則將在 __imp__func 上得到 LNK2001。當不用 /MD 進行編譯時,如果試圖與 MSVCxx.lib 鏈接,則並非總是得到 LNK2001,但可能會有其他問題。

7.在生成應用程序的調試版本時與發布模式庫鏈接會導致 LNK2001。同樣,使用 /Mxd 選項(/MTd 或 /MDd)和/或定義 _DEBUG,然後再與版本庫鏈接,將可能會產生無法解析的外部對象(同時還會出現其他問題)。將發布模式生成與調試庫鏈接同樣會導致類似問題。

8.將 Microsoft 庫版本和編譯器產品版本混合可能會有問題。新編譯器版本的庫可能包含早期版本的庫中沒有的新符號。可能需要更改搜索路徑中的目錄順序,或將它們更改為指向當前版本。

9.使用庫文件選擇下的“工具”|“選項”|“項目”|“VC++ 目錄”對話框,可以更改搜索順序。項目的“屬性頁”對話框中的“鏈接器”文件夾可能也包含可能已過期的路徑。

10.當安裝了新的 SDK(可能在不同的位置),但沒有將搜索順序更新為指向新位置時,可能會出現此問題。通常情況下,應將新 SDK 的 include 目錄和 lib 目錄的路徑放在默認 Visual C++ 位置的前面。另外,包含嵌入路徑的項目可能仍然指向舊路徑,這些路徑是有效的,但對於安裝到不同位置的新版本所添加的新功能已過期。

11.編譯器供應商之間、甚至同壹編譯器的不同版本之間當前沒有 C++ 命名標準。因此,鏈接用其他編譯器編譯的對象文件可能無法生成相同的命名方案,從而導致錯誤 LNK2001。

12.在不同模塊上混合內聯和非內聯編譯選項會導致 LNK2001。如果創建 C++ 庫時打開了函數內聯(/Ob1 或 /Ob2),但描述函數的相應頭文件的內聯是關閉的(沒有 inline 關鍵字),則將發生此錯誤。若要防止此問題,請在要包含到其他文件中的頭文件中用 inline 定義內聯函數。

13.如果使用 #pragma inline_depth 編譯器指令,請確保具有 設置為 2 或更大的值,並確保使用 /Ob1 或 /Ob2 編譯器選項。

14.在創建純資源 DLL 時省略 LINK 選項 /NOENTRY 將導致 LNK2001。

15.使用不正確的 /SUBSYSTEM 或 /ENTRY 設置會導致 LNK2001。例如,如果編寫基於字符的應用程序(控制臺應用程序)並指定 /SUBSYSTEM:WINDOWS,您將得到無法解析的 WinMain 外部對象。有關這些選項和入口點的更多信息,請參見 /SUBSYSTEM 和 /ENTRY 鏈接器選項。

  • 上一篇:軟件測試工作總結
  • 下一篇:計算機軟件技術發展前景怎麽樣?
  • copyright 2024編程學習大全網