鏈結器工具錯誤 LNK2001

2021-03-31 08:56:31 字數 2330 閱讀 1174

無法解析的外部符號「symbol」

**引用了鏈結器無法在庫和物件檔案中找到的內容(如函式、變數或標籤)。

可能的原因

該錯誤資訊之後為致命錯誤 lnk1120。

具體原因

**問題

編譯和鏈結問題

將用 /mt 編譯的**與庫 libc.lib 鏈結會在_beginthread_beginthreadex_endthread_endthreadex上導致 lnk2001。

鏈結需要多執行緒庫的**(任何 mfc **或用 /mt 編譯的**)會在 _beginthread、_beginthreadex、_endthread 和_endthreadex上導致 lnk2001。有關更多資訊,請參見下列知識庫文章:

在用/md進行編譯時,因為所有的執行庫現在都存放在 dll 中,所以源中的「func」引用在物件中變為「__imp__func」引用。如果試圖與靜態庫 libc.lib 或 libcmt.lib 鏈結,則將在__imp__func上得到 lnk2001。當不用 /md 進行編譯時,如果試圖與 msvcxx.lib 鏈結,則並非總是得到 lnk2001,但可能會有其他問題。

將用顯式或隱式/ml編譯的**鏈結到 libcmt.lib 時將在_errno上導致 lnk2001。

在生成應用程式的除錯版本時與發布模式庫鏈結會導致 lnk2001。同樣,使用/mxd選項(/mld/mtd/mdd)並/或定義 _debug,然後與發布庫鏈結將帶來潛在的無法解析的外部物件(以及其他問題)。將發布模式生成與除錯庫鏈結同樣會導致類似問題。

將 microsoft 庫版本和編譯器產品版本混合可能會有問題。新編譯器版本的庫可能包含早期版本的庫中沒有的新符號。可能需要更改搜尋路徑中的目錄順序,或將它們更改為指向當前版本。 通過庫檔案選擇下的「工具」 | 「選項」 | 「專案」 | 「vc++ 目錄」對話方塊,您可以更改搜尋順序。專案的「屬性頁」對話方塊中的「鏈結器」資料夾可能也包含可能已過期的路徑。

當安裝了新的 sdk(可能在不同的位置),但沒有將搜尋順序更新為指向新位置時,可能會出現此問題。通常情況下,應將新 sdk 的 include 目錄和 lib 目錄的路徑放在預設 visual c++ 位置的前面。另外,包含嵌入路徑的專案可能仍然指向舊路徑,這些路徑是有效的,但對於安裝到不同位置的新版本所新增的新功能已過期。

編譯器**商之間、甚至同一編譯器的不同版本之間當前沒有 c++ 命名標準。因此,鏈結用其他編譯器編譯的物件檔案可能無法生成相同的命名方案,從而導致錯誤 lnk2001。

在不同模組上混合內聯和非內聯編譯選項會導致 lnk2001。如果建立 c++ 庫時開啟了函式內聯(/ob1 或 /ob2),但描述函式的相應標頭檔案的內聯是關閉的(沒有inline關鍵字),將發生此錯誤。若要防止此問題,請在要包含到其他檔案中的標頭檔案中用inline定義內聯函式。

如果使用#pragma inline_depth編譯器指令,請確保具有設定為 2 或更大的值,並確保使用 /ob1 或 /ob2 編譯器選項。

在建立純資源 dll 時省略 link 選項 /noentry 將導致 lnk2001。

使用不正確的 /subsystem 或 /entry 設定會導致 lnk2001。例如,如果編寫基於字元的應用程式(控制台應用程式)並指定 /subsystem:windows,您將得到無法解析的winmain外部物件。有關這些選項和入口點的更多資訊,請參見 /subsystem 和 /entry 鏈結器選項。

建立的專案是乙個託管 dll,它包含的 microsoft 中間語言**沒有鏈結到本機 c/c++ 庫(如 crt、atl 或 mfc),而您是從使用靜態變數的本機 c/c++ 庫新增**。若要修復,必須將該專案轉換為混合模式。有關更多資訊,請參見將 c++ 託管擴充套件專案從純中間語言轉換為混合模式。

匯出問題

解釋輸出

如果符號無法解析,通過下列指南可獲得有關函式的資訊:

在 x86 平台上,用 c 編譯的名稱或 c++ 中的 extern "c" 名稱的呼叫約定修飾是:

__cdecl函式具有下劃線 (_) 字首。

__stdcall函式具有下劃線 (_) 字首和 @ 字尾,後跟堆疊上引數的雙倍字長對齊大小。

__fastcall函式具有 @ 字首和 @ 字尾,後跟堆疊上引數的雙倍字長對齊大小。

使用 undname.exe 獲取修飾名的未修飾格式。

鏈結器工具錯誤 LNK2001

無法解析的外部符號 symbol 引用了鏈結器無法在庫和物件檔案中找到的內容 如函式 變數或標籤 可能的原因 該錯誤資訊之後為致命錯誤 lnk1120。具體原因 問題 編譯和鏈結問題 將用 mt 編譯的 與庫 libc.lib 鏈結會在 beginthread beginthreadex endth...

鏈結錯誤LNK2001

學習vc 時經常會遇到鏈結錯誤lnk2001,該錯誤非常討厭,因為對於 程式設計者來說,最好改的錯誤莫過於編譯錯誤,而一般說來發生連線錯誤時,編譯都已通過。產生連線錯誤的原因非常多,尤其lnk2001錯誤,常常使人不 明其所以然。如果不深入地學習和理解vc 要想改正連線錯誤lnk2001非 常困難。...

鏈結錯誤LNK2001

學習vc 時經常會遇到鏈結錯誤lnk2001,該錯誤非常討厭,因為對於 程式設計者來說,最好改的錯誤莫過於編譯錯誤,而一般說來發生連線錯誤時,編譯都已通過。產生連線錯誤的原因非常多,尤其lnk2001錯誤,常常使人不 明其所以然。如果不深入地學習和理解vc 要想改正連線錯誤lnk2001非 常困難。...